gpt4 book ai didi

android - 使用 Retrofit 自定义错误处理

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:56:19 26 4
gpt4 key购买 nike

我正在使用的 REST Api 具有根据状态从服务器发送的自定义代码和消息,我想实现自定义 Callback<T>调用 success仅当状态代码为 0 时才执行方法。

从服务器收到的成功响应示例:

{
"code":"0",
"message":"success",
"data": {
"actual_data":"goes_here",
"need_to_construct_objects","from_data"
}
}

失败响应示例:

{
"code":"301",
"message":"wrong_password",
"data": {
"actual_data":"will_be_null",
"no_need_to_construct_objects","from_data"
}
}

codemessage由所有请求返回,data包含实际响应值,因此我想执行以下操作:

  1. 检查代码消息,只调用success()如果代码为 0。
  2. 调用failure()如果请求失败或code != 0
  3. 根据数据响应构造自定义对象并通过success()传递它们

最好的方法是什么?我到处搜索,找不到好的解决方案。我唯一得到的是让所有自定义对象都有 codemessage字段并检查它们在 success() 中的值, 但如果有人忘记检查 code,这可能会在将来引起问题。在继续之前。

最佳答案

您可以通过创建一个实现回调的抽象类并声明您自己的抽象成功和失败方法来快速完成此操作。抽象类将处理 Retrofit 的标准回调方法,解释响应并相应地调用抽象方法。

我认为另一种可能的方法是覆盖 Retrofit 的客户端接口(interface)来构建您自己的 Response 对象。

如果扩展 OkClient ,它可以像这样:

public class CustomClient extends OkClient {

@Override public Response execute(Request request) throws IOException {
Response originalRespone = super.execute(request);

int statusCode = 0;
//TODO: read JSON response here (using GSON or similar, and extract status code and message... etc.)

//Convert the status code to HTTP standard status codes, according to the documentation you have.
if(statusCode == 0) statusCode = 200;
//Reconstruct a Response object
return new Response(originalResponse.getUrl(), statusCode, originalResponse.getReason() /*should probably replace with parsed message*/, originalResponse.getHeaders(), originalResponse.getBody());
}

这可能比在回调中处理您的案例需要更多的工作,但我认为如果 API 在某个时候转换为 RESTful API 约定,它会有所帮助。

虽然这个解决方案有其自身的问题,因为这意味着 JSON 转换将运行两次。一个在您的客户中,另一个由 Retrofit 提供。目前不确定正确的方法。可能与 TypedInput 和传递已转换对象的虚​​拟转换器有关。

关于android - 使用 Retrofit 自定义错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26043631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com