如何在OkHttp RequestBody中传递JSON对象调用外部API
解决OkHttp传递大JSON对象作为表单参数的问题
方案1:将JSON对象序列化为字符串后传递
如果后端期望接收application/x-www-form-urlencoded类型的表单,且某个字段的值为JSON内容,可直接将JSON对象序列化为字符串,通过FormBody.add()传递:
- 先把JSON对象转成字符串(以
org.json.JSONObject为例):
JSONObject jsonObject = new JSONObject(); // 填充你的大JSON内容... // 序列化为字符串 String jsonString = jsonObject.toString();
- 构建表单并发起请求:
RequestBody formBody = new FormBody.Builder() .add("something", jsonString) .build(); Request request = new Request.Builder() .url(BASE_URL + "/users") .post(formBody) .build(); Call call = client.newCall(request); Response response = call.execute();
注意:需要和后端确认,他们能正确解析该字段的JSON字符串内容。
方案2:直接发送JSON格式的请求体(推荐,若后端支持)
如果后端接口支持接收application/json类型的请求体,没必要用表单格式,直接将整个JSON作为请求体发送,更适合大体积JSON场景:
// 将JSON对象转为字符串 String jsonString = jsonObject.toString(); // 构建JSON类型的请求体 RequestBody requestBody = RequestBody.create( jsonString, MediaType.parse("application/json; charset=utf-8") ); // 发起请求 Request request = new Request.Builder() .url(BASE_URL + "/users") .post(requestBody) .build(); Call call = client.newCall(request); Response response = call.execute();
这种方式避免了表单编码的额外开销,传输大JSON时效率更高。
内容的提问来源于stack exchange,提问作者Dhruv Singhal
相关产品推荐
相关产品推荐

