我有REST api,它根据同一路径的当前状态做出响应。让我们假设/api/users
回复
{
"status":200,
"error":false,
"users":["a","b"]
}
如果用户已获得授权。
否则,如果用户未获得授权,则以{"status":403,"error":true,"redirect":"url"}
回复。使用Retrofit为api调用定义Interface时,它需要确切类型的响应对象。
前:
@GET("users")
Call<List<User>> getUsers()
但是这里的API服务器会响应不同形状的对象。如何处理这种情况?
答案 0 :(得分:2)
基于意见的回答
基类
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
答案 1 :(得分:0)
使用此类作为模型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) {
}
});