Android中Retrofit 2.0提交x-www-form-urlencoded格式JSON数据失败怎么办?
解决Retrofit 2.0提交x-www-form-urlencoded数据失败的问题
我来帮你分析下问题出在哪:你在代码里用@Body传递JSONObject,虽然手动加了Content-Type: application/x-www-form-urlencoded的Header,但Retrofit会自动把JSONObject序列化为JSON字符串,而服务器期望的是表单键值对(比如role=owner&id=27001)的格式,两者不匹配,所以请求失败了。
下面给你两种靠谱的解决方案:
方案一:用@FormUrlEncoded + @Field(推荐)
这种方式是Retrofit官方推荐的提交表单数据的方式,会自动帮你处理Content-Type和请求体格式:
1. 修改接口定义
// 去掉手动的Content-Type Header,用@FormUrlEncoded替代 @FormUrlEncoded @POST("/api/jsonws/pushUserData") Call<ResponseBody> pushData( @Field("role") String role, @Field("id") String id );
2. 调用接口
直接传入参数即可,不用再构建JSONObject:
ApiInterface apiInterface = ApiClient.getClientAuthentication(); Call<ResponseBody> call = apiInterface.pushData("owner", "27001"); call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { // 处理请求成功的逻辑 if (response.isSuccessful()) { // 可以在这里获取返回数据 } } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { // 处理请求失败的逻辑,比如打印错误信息 t.printStackTrace(); } });
方案二:用FormBody构建请求体
如果你的参数比较多或者需要动态构建,可以用FormBody来手动组装表单数据:
1. 修改接口定义
@POST("/api/jsonws/pushUserData") Call<ResponseBody> pushData(@Body RequestBody requestBody);
2. 构建并传递请求体
// 用FormBody.Builder组装键值对 RequestBody formBody = new FormBody.Builder() .add("role", "owner") .add("id", "27001") .build(); ApiInterface apiInterface = ApiClient.getClientAuthentication(); Call<ResponseBody> call = apiInterface.pushData(formBody); // 同样处理回调逻辑 call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { // 成功处理 } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { // 失败处理 } });
这两种方式都能生成服务器期望的x-www-form-urlencoded格式请求体,你可以根据自己的场景选择其中一种。
内容的提问来源于stack exchange,提问作者Kamal Kakkar
相关产品推荐
相关产品推荐

