
本文详解如何使用 okhttp 发送包含完整 json 对象的 post 请求,避免误用 formbody 传参,推荐采用 requestbody.create() 配合 mediatype 指定 application/json,并提供 gson 序列化与错误处理的最佳实践。
本文详解如何使用 okhttp 发送包含完整 json 对象的 post 请求,避免误用 formbody 传参,推荐采用 requestbody.create() 配合 mediatype 指定 application/json,并提供 gson 序列化与错误处理的最佳实践。
在 OkHttp 中,FormBody.Builder() 仅适用于 application/x-www-form-urlencoded 类型的表单提交(如登录参数),其 .add(key, value) 方法要求每个字段为独立字符串键值对——它无法直接承载结构化 JSON 对象,更不支持嵌套、数组或大体积 JSON 数据。若强行将整个 JSON 字符串作为某个 key 的 value(如 .add("payload", jsonString)),服务端接收到的将是形如 payload={...} 的 URL 编码字符串,而非标准的 JSON 请求体,极易导致 400 Bad Request 或解析失败。
✅ 正确做法:使用 RequestBody.create() 构造原始 JSON 请求体,并显式声明 MediaType.get("application/json; charset=utf-8"):
// 示例:发送用户注册 JSON 数据
String json = new Gson().toJson(new User("alice", "alice@example.com", 28));
RequestBody body = RequestBody.create(
json,
MediaType.get("application/json; charset=utf-8")
);
Request request = new Request.Builder()
.url("https://api.example.com/users")
.post(body) // 直接传入 JSON 请求体
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
System.out.println("Success: " + response.body().string());
} else {
throw new IOException("HTTP error: " + response.code());
}
}? 关键要点:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- 绝不混用 FormBody 与 JSON:FormBody 是为表单设计的,JSON 必须走 RequestBody.create();
- 显式指定 MediaType:MediaType.get("application/json; charset=utf-8") 确保服务端正确识别内容类型;
- 推荐序列化工具:Gson、Jackson 或 Moshi 均可;若已有 POJO(如 User 类),优先通过对象序列化生成 JSON,提升类型安全与可维护性;
- 大 JSON 处理无压力:RequestBody.create() 直接接受 String 或 byte[],天然支持任意大小的 JSON 内容;
- 注意资源释放:Response.body().string() 只能调用一次,生产环境建议用 response.body().bytes() 或流式处理避免内存问题。
? 进阶提示:可封装通用 JSON 请求工具方法,统一处理异常、超时与日志:
public static RequestBody jsonBody(Object obj) {
String json = new Gson().toJson(obj);
return RequestBody.create(json, MediaType.get("application/json; charset=utf-8"));
}综上,抛弃“把 JSON 塞进 FormBody”的思路,拥抱原生 JSON 请求体设计,是保障 API 通信健壮性与可扩展性的关键一步。

















