【问题标题】:Retrofit - Parsing generic api response with base classRetrofit - 使用基类解析通用 api 响应
【发布时间】:2018-02-05 14:01:31
【问题描述】:

我正在为我的 android 应用程序开发的 rest api 调用使用改造。由于我的所有 api 响应都有 "info"(请注意,所有 api 将具有相同的键名)和 "data"注意不同的 api 有不同的键名)参数,我使用了一个基类api 响应。以下是来自 API 的示例响应

响应 1

{
"info":{
        "statusCode":200,
        "message":"OK"
       },
"data":{
        "userId":2,
        "userName":"riyas"
       }
 }

响应 2

{
"info":{
        "statusCode":200,
        "message":"OK"
       },
"data":{
        "vegId":2,
        "vegName":"Potatoa"
       }
 }

我创建了一个名为 CloudBaseResponse 的基类,并且能够在 response.info 中获取数据。但我不知道解析 **data** 。请建议我使用 Retrofit

的处理方法
public class CloudBaseResponse {

   public BaseResponse response;

    public BaseResponse  getResponse() {
        return response;
    }

    public void setResponse(BaseResponse response) {
        this.response = response;
    }

    public class BaseResponse {
        public Info info;

    }

    public class Info{
        public String status;
        public String message;
    }

}

【问题讨论】:

  • 您是否使用 Gson 反序列化您的响应?

标签: android retrofit2 gson


【解决方案1】:

您可以使用Generics 来映射您的 api 响应。

public class CloudBaseResponse<T> {
    @SerializedName("info")   
    private Info info;    

    @SerializedName("data")
    private T data;

    // Getters Setters..
}  

public class Info {
    private String status;
    private String message;

    // Getters Setters.. 
}

例如,您有一个 Vegetable 类。

public class Vegetable {
    private int vegetableId;
    private String vegetableName;

    // Getters Setters..
}

稍后您可以使用Retrofit,如下代码:

Call<CloudBaseResponse<Vegetable>> getVegetables();

【讨论】:

  • 如果它是来自 API 的 T 数据列表呢?
  • 您可以创建一个像“CloudBaselistResponse>”这样的通用响应并像这样处理响应。数据应该是 List data
  • 我明白了。请看我刚刚发布的这个问题,我在这里阐述了我的担忧:stackoverflow.com/questions/67816386/…
【解决方案2】:

创建一个名为 BaseModel 的类并在您的响应模型(数据)中扩展它

public class BaseModel {
    Info info;

    public getInfo(){ return info;}
    public setInfo(Info info){ this.info = info; }

    public BaseModel() {
    }
}

public class Info{
    int statusCode;
    String message;

    public int getStatusCode() {
        return statusCode;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public void setStatusCode(int statusCode) {
        this.statusCode = statusCode;
    }
}

你的数据类是这样的:

class Response extends BaseModel {
    public Data data;
}

class Data{
    public int vegId;
    public String vegName;
}

最后,在Retrofit 中,您可以解析对Response 类的响应

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 2018-12-17
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多