2016-10-11 18 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(); 

希望这可以帮助别人。