如何在Retrofit中发送携带原始JSON格式数据的POST请求?
解决Retrofit发送JSON请求体的问题
看起来你在Retrofit里发送application/json格式的POST请求时遇到了坑,我来帮你梳理下问题所在和正确的实现方式:
先说说你之前写法的问题
- 手动通过
@Header设置Content-Type容易和Retrofit的JSON转换器自动设置的头冲突; - 直接用
JSONObject作为@Body参数,Retrofit默认没有对应的转换器来序列化它,所以会导致请求失败。
正确的实现方案
第一步:确保Retrofit实例配置了JSON转换器
这是核心前提,没有转换器的话,Retrofit不知道怎么把你的数据转换成JSON格式:
Retrofit retrofit = new Retrofit.Builder() .baseUrl("你的API基础地址") .addConverterFactory(GsonConverterFactory.create()) // 必须添加这个Gson转换器 .build();
方式一:用POJO类作为请求体(推荐,类型更安全)
先创建一个对应请求结构的实体类:
public class RequestPayload { // 这里根据你的实际请求字段定义,比如 private String username; private String email; // 构造方法、getter/setter,或者用Lombok的@Data注解简化 public RequestPayload(String username, String email) { this.username = username; this.email = email; } }
然后定义接口,不需要手动设置Content-Type,Gson转换器会自动帮你设置application/json:
public interface AddData { @POST("/Api/") Call<String> postData(@Body RequestPayload body); }
方式二:如果一定要用JSONObject作为请求体
这种情况需要手动构建RequestBody并指定媒体类型:
public interface AddData { @POST("/Api/") Call<String> postData(@Body RequestBody body); }
调用的时候这样构建请求体:
// 组装JSON数据 JSONObject jsonObject = new JSONObject(); try { jsonObject.put("username", "test_user"); jsonObject.put("email", "test@example.com"); } catch (JSONException e) { e.printStackTrace(); } // 构建RequestBody,指定媒体类型为application/json RequestBody requestBody = RequestBody.create( jsonObject.toString(), MediaType.parse("application/json; charset=utf-8") ); // 发起请求 AddData apiService = retrofit.create(AddData.class); Call<String> call = apiService.postData(requestBody); // 后续执行异步/同步请求...
额外提示:如果非要固定接口的Content-Type
可以用@Headers复数注解(区别于单个的@Header),不过在有Gson转换器的情况下这其实是多余的:
public interface AddData { @Headers("Content-Type: application/json") @POST("/Api/") Call<String> postData(@Body RequestPayload body); }
内容的提问来源于stack exchange,提问作者sangeeta
相关产品推荐
相关产品推荐

