2016-10-11 17 views
0

我使用postman來測試我的請求。所以,我選擇從郵遞員,顯示的代碼片斷的選項,選擇OkHttp和片段是:如何在有很多參數時將內容傳遞給RequestBody?

OkHttpClient client = new OkHttpClient(); 

MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded"); 

RequestBody body = RequestBody.create(mediaType, "a=foo&b=bar&c=wow&d=awesome&e=random&f=rainbows /** lots of strings **/"); 
Request request = new Request.Builder() 
.url(URL) 
.post(body) 
.addHeader("content-type", "application/x-www-form-urlencoded") 
.addHeader("cache-control", "no-cache") 
.addHeader("postman-token", "40052d2a-0ff0-ead4-1cf7-1c12f9b8eca9") 
.build(); 

Response response = client.newCall(request).execute(); 

RequestBody內容是非常大的。我試圖用String連接創建它,它的工作原理是什麼,但是如果我得到一個帶空格的字符串,並且知道存在哪些其他邊界案例可能會混淆內容。

那麼有沒有比字符串連接更好的方法?

回答

2

我想你想使用FormBody:

RequestBody body = new FormBody.Builder() 
     .add("imageUrl", imageUri.toString()) 
     .add("caption", caption) 
     .add("foo", "bar") 
     .build(); 

它還添加的內容類型,爲您和關心編碼。

另一種選擇是Uri類,但由於您已經在使用okhttp3,因此不需要它。

+0

如果我使用FormBody並將它傳遞給Request.Builder(),我所做的請求是不正確的。我認爲缺少的是mediaType,這是因爲在傳遞正文到'Request.Builder()' – mt0s

+0

之前,我在'RequestBody.create()'中使用了上面的代碼。如果你看[源代碼](https:// github.com/square/okhttp/blob/master/okhttp/src/main/java/okhttp3/FormBody.java#L29),你可以看到它使用了適當的媒體類型。關於你的代碼片段的新內容是FormBody實際上是對字符串進行編碼,照顧你擔心的空間和其他角色。 – natario

0

如果您有大量數據,只需使用MediaType(如「application/json」),並且Content是Json字符串。首先,創建一個JSONObject把數據,然後使用toString()方法來獲得JSON字符串 然後像這樣的代碼:

MediaType mediaType = MediaType.parse("application/json"); 

OkHttpClient okHttpClient = new OkHttpClient(); 
RequestBody requestBody = RecordBody.create(mediaType, jsonString); 
Request request = Request.Builder().url(url).post(requestBody).build(); 

Response response = okHttpClient.newCall(request).execute(); 

希望這可以幫助別人。