改造 2 - 空响应体

Posted

技术标签:

【中文标题】改造 2 - 空响应体【英文标题】:Retrofit 2 - null response body 【发布时间】:2016-02-18 20:44:25 【问题描述】:

我正在尝试使用Retrofit 2 转换以下响应


    "errorNumber":4,
    "status":0,
    "message":"G\u00f6nderilen de\u011ferler kontrol edilmeli",
    "validate":[
        "Daha \u00f6nceden bu email ile kay\u0131t olunmu\u015f. L\u00fctfen giri\u015f yapmay\u0131 deneyiniz."
    ]

但我总是在onResponse 方法中得到null 响应。因此,我尝试使用response.errorBody.string() 查看响应的错误正文。错误正文包含与原始响应完全相同的内容。

这是我的服务方法,Retrofit 对象和响应数据声明:

@FormUrlEncoded
@POST("/Register")
@Headers("Content-Type: application/x-www-form-urlencoded")
Call<RegisterResponse> register(
        @Field("fullName")  String fullName,
        @Field("email")     String email,
        @Field("password")  String password);

public class RegisterResponse 
    public int status;
    public String message;
    public int errorNumber;
    public List<String> validate;


OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor() 
    @Override
    public Response intercept(Chain chain) throws IOException 
        Response response = chain.proceed(chain.request());
        final String content = UtilityMethods.convertResponseToString(response);
        Log.d(TAG, lastCalledMethodName + " - " + content);
        return response.newBuilder().body(ResponseBody.create(response.body().contentType(), content)).build();
    
);
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .client(client)
        .build();
domainSearchWebServices = retrofit.create(DomainSearchWebServices.class);

我已经控制了JSONjsonschema2pojo 的响应,看看我是否对我的响应类 wright 进行了建模,看起来还可以。

为什么 Retrofit 无法转换我的响应?

更新

现在作为一种解决方法,我正在从错误正文中构建我的响应。

【问题讨论】:

你设置了Json转换器吗?像下面RestAdapter restAdapter = new RestAdapter.Builder() .setConverter(new GsonConverter(gson)) @problemsolver 是的,我做到了。我已经添加了相关代码。 @problemsolver 我用过addConverterFactory 而不是setConverter 收到什么响应状态?您可以使用调用方法response.getStatus()进行检查 根据***:400 Bad Request 服务器不能或不会处理请求,因为某些被认为是客户端错误(例如,格式错误的请求语法、无效的请求消息帧或欺骗性请求路由) )。所以 Retrofit 把它当作错误响应 【参考方案1】:

我已经解决了这个问题。当我发出错误请求 (HTTP 400) 时,Retrofit 不会转换响应。在这种情况下,您可以使用response.errorBody.string() 访问原始响应。之后你可以创建一个新的 Gson 并手动转换它:

if (response.code() == 400 ) 
    Log.d(TAG, "onResponse - Status : " + response.code());
    Gson gson = new Gson();
    TypeAdapter<RegisterResponse> adapter = gson.getAdapter(RegisterResponse.class);
    try 
        if (response.errorBody() != null)
            registerResponse = 
                adapter.fromJson(
                    response.errorBody().string());
     catch (IOException e) 
        e.printStackTrace();
    

【讨论】:

@IgorGanapolsky 您应该始终检查正文或错误正文是否为空。 我也遇到了类似的问题,能否请您指教? ***.com/questions/39261481/… 谢谢老板。你节省了我的时间。 :)

以上是关于改造 2 - 空响应体的主要内容,如果未能解决你的问题,请参考以下文章

Retrofit2 OkHttp3 响应正文空错误

改造回调获取响应体

改造响应体! Kotlin 安卓工作室

上传改造图像但返回空服务器响应

如何使用 Retrofit 2 处理空响应体?

改造响应空,错误的数据类实现?