【问题标题】:Get difference types of JSON response Retrofit获取不同类型的 JSON 响应 Retrofit
【发布时间】:2018-06-11 09:31:43
【问题描述】:

我有 REST api,它根据同一路径上的当前状态做出响应。让我们假设 /api/users

响应
{
  "status":200,
  "error":false,
  "users":["a","b"]
} 

如果用户被授权。 否则,如果用户没有被授权,它会回复{"status":403,"error":true,"redirect":"url"}。使用 Retrofit 为 api 调用定义接口时,它需要响应对象的确切类型。

例如:

@GET("users")
Call<List<User>> getUsers()

但是这里的 API 服务器响应不同形状的对象。这种情况如何处理?

【问题讨论】:

  • 创建一个由成功响应类和失败响应类扩展的基类。在 API 接口中使用基类。当实际响应到来时,检查错误代码并进行相应的解析。

标签: java android rest retrofit2


【解决方案1】:

基于意见的回答

一个基类

public class BaseResponse{
    int status;
    String error;
    ...
    ...
}

成功响应类

public class SuccessResponse extends BaseResponse{
    String[] users;
    ...
    ...
}

一个失败响应类

public class FailureResponse extends BaseResponse{
    String redirect;
    ...
    ...
}

API接口

@GET("users")
Call<BaseResponse> getUsers()

数据到达时

if(response.code == 200)
    // Parse with SuccessResponse Class
else
    // Parse with FailureResponse class

【讨论】:

    【解决方案2】:

    使用这个类作为你的模型 pojo

    public class User {
    
    @SerializedName("status")
    @Expose
    private int status;
    @SerializedName("error")
    @Expose
    private String error;
    @SerializedName("users")
    @Expose
    private String users;
    
    public int getStatus() {
        return status;
    }
    
    public void setStatus(int status) {
        this.status = status;
    }
    
    public String getError() {
        return error;
    }
    
    public void setError(String error) {
        this.error = error;
    }
    
    public String getUsers() {
        return users;
    }
    
    public void setUsers(String users) {
        this.users = users;
    }
    

    }

    并在您的改造中将此模型称为...

    Call<List<User>> res = BaseUrlClass.yourInterfaceHere().getUsers();
        res.enqueue(new Callback<List<User>>() {
            @Override
            public void onResponse(Call<List<User>> call, Response<List<User>> response) {
                int stat;
                String err,uuser;
                List<User> a = response.body();
               for(int i = 0;i<a.size;i++){
                      User u = a.get(i);
                       stat = u.getStatus();
                       err = u.getError();
                       uuser = u.getUsers();
    
                if(stat == 200){
                       //do this
                  } else{
                        //do this
                      }
            }
    
            @Override
            public void onFailure(Call<List<User>> call, Throwable t) {
    
            }
        });
    

    【讨论】:

    • 但是如何从 User 类中获取 "redirect":"url"。它不是用户的财产。
    • 你能发布你的json吗?
    • 请看问题。 {"status":403,"error":true,"redirect":"url"} 这是另一个回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 2018-12-17
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2017-10-25
    相关资源
    最近更新 更多