【问题标题】:How to configure Retrofit to convert success/error responses如何配置改造以转换成功/错误响应
【发布时间】:2019-09-18 17:37:10
【问题描述】:

服务器在成功的情况下发送响应(代码 2xx):

{
    "user":"User",
    "age":16
}

如果失败(4xx),则在errorBody中发送以下Json:

{
    "errorMessage":"Server is not working",
    "action":{
         ...
    }
}

如何配置 Retrofit 以便它根据成功/失败自动转换响应。 注意:我使用的是 JavaRx v2.2.0 和 Retrofit v2.4.0

我的 API 调用方法如下:

@GET("/screens/home")
Single<HomeResponse> getHome(@Query("langCode") String langCode);

我试图用Response(改造的)封装HomeResponse(我自己的java类)。但是,我没有得到我想要的。

@GET("/screens/home")
Single<Reponse<HomeResponse>> getHome(@Query("langCode") String langCode);

【问题讨论】:

    标签: android retrofit2 rx-java2


    【解决方案1】:

    使您的 HomeResponse 类具有您希望从成功和错误中获得的所有属性,如下所示。

    class HomeResponse {
        String user;
        String age;
        String errorMessage;
        Action action;
    }
    

    Action 将是您的另一门课程。 您只需在响应时检查 errorMessage 是否为空。

    【讨论】:

      【解决方案2】:

      你可以使用这个link 来制作 pojo 类, 在 json 中写入成功和错误响应字段,您将合并两个 json 并创建一个 pojo 类

      您可以通过status 或定义这是error 响应的东西来检查响应

      编辑

      看到这个

      import com.google.gson.annotations.Expose;
      import com.google.gson.annotations.SerializedName;
      
      public class MyApiResponse {
      
      @SerializedName("user")
      @Expose
      private String user;
      @SerializedName("age")
      @Expose
      private Integer age;
      @SerializedName("errorMessage")
      @Expose
      private String errorMessage;
      @SerializedName("action")
      @Expose
      private Action action;
      
      public String getUser() {
      return user;
      }
      
      public void setUser(String user) {
      this.user = user;
      }
      
      public Integer getAge() {
      return age;
      }
      
      public void setAge(Integer age) {
      this.age = age;
      }
      
      public String getErrorMessage() {
      return errorMessage;
      }
      
      public void setErrorMessage(String errorMessage) {
      this.errorMessage = errorMessage;
      }
      
      public Action getAction() {
      return action;
      }
      
      public void setAction(Action action) {
      this.action = action;
      }
      
      }
      

      【讨论】:

      • 错误在 errorBody 中发送。我希望 Retrofit 自动转换,而不是每次都自己转换,因为我的 App 中有很多 API 调用方法。
      • 查看我的编辑,这里如果你得到错误而不是errorMessage 不会null 否则它会null 建议:如果你得到相同的错误响应所有api 比您可以将其设置为BaseModel 并在所有model 中为所有apis 扩展它
      • 如果出现错误,我不会直接得到错误响应。它来自 Response 类的 errorBody
      • 我没有得到你
      【解决方案3】:

      对于这种形式的响应数据规则,最好创建一个基础响应类:

      class BaseResponse {
          String errorMessage;
          Action action;
          //ingore getters setters
      }
      

      并让您的其他响应类扩展它

      class HomeResponse extend BaseResponse{
          String user;
          String age;
      }
      
      class OtherResp extend BaseResponse{
          String otherField;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-10
        • 1970-01-01
        • 2014-12-08
        • 2018-05-17
        • 2014-12-20
        • 2015-10-26
        • 2016-09-28
        • 2018-09-14
        相关资源
        最近更新 更多