Retrofit 2.0如何获得反序列化错误response.body

新手上路,请多包涵

我正在使用 Retrofit 2.0.0-beta1

在测试中,我有一个替代方案并期望出现错误 HTTP 400

我想要 retrofit.Response<MyError> response 但是 response.body() == null

MyError 没有反序列化 - 我只在这里看到

response.errorBody().string()

但它没有给我 MyError 作为对象

原文由 Piotr Boho 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

通过以下方式解决了它:

 Converter<MyError> converter =
    (Converter<MyError>)JacksonConverterFactory.create().get(MyError.class);
MyError myError =  converter.fromBody(response.errorBody());

原文由 Piotr Boho 发布,翻译遵循 CC BY-SA 3.0 许可协议

我目前使用一个非常简单的实现,不需要使用转换器或特殊类。我使用的代码如下:

 public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
    DialogHelper.dismiss();

    if (response.isSuccessful()) {
        // Do your success stuff...
    } else {
        try {
            JSONObject jObjError = new JSONObject(response.errorBody().string());
            Toast.makeText(getContext(), jObjError.getJSONObject("error").getString("message"), Toast.LENGTH_LONG).show();
        } catch (Exception e) {
            Toast.makeText(getContext(), e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }
}

这里要注意的一点是 response.errorBody().string() 只会返回一次正确的值。如果再次调用它,它将返回一个空字符串。因此,如果您想重用它,请在第一次调用时将值存储在变量中。

有一种方法可以从响应中获取错误主体字符串,而不会在下一次调用时将其设为空,方法是滚动您自己的 toString() 实现,它不会更新 errorBody 缓冲区的读取-指针。有关详细信息,请参阅 此答案

原文由 Saif Bechan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题