我必须使用使用JSend格式的API。
长话短说,它使用的是HTTP状态代码,表示状态如下:
哪个好,因为我可以从中确定我的API请求是否成功。
BUT:
由于JSend格式有它自己的东西,它在响应时也有一个小状态指示器,如下所示:
{
status : "success",
data : { "post" : { "id" : 2, "title" : "Another blog post", "body" : "More content" }}
}
因此它具有“#”状态'此字段还显示API请求是否成功。
问题:
用于解析对POJO的响应的改造,因此它假定响应仅包含模型而没有成功的指标,例如:(模型后实例)
{ "id" : 2, "title" : "Another blog post", "body" : "More content" }
我的问题是:
有解决方案吗? 我可以预先解析状态指示器,拆分数据' (模型)响应的一部分并将其改为仅解析该部分?
如果不是,我将不得不添加"状态"属于我的每个模特,这显然不是一个适合步行的方式,我不会那样做。
我是否应该坚持手动解析并使用ResponseBody
代替我的模型
void onResponse(Call<T> call, Response<T> response);
类型参数, T
?
因为这样我可以使用.string()
并将字符串转换为JSON,之后我可以手动解析我的模型,就像为它们编写解析器一样。
我真的想使用Retrofit的功能进行自动解析,因为使用JSend我无法想象无论如何都可以做到这一点。
我不能改变它会成为这样的API。
答案 0 :(得分:4)
这是我的Response
课程。
public class Response<T> implements Serializable {
private T data;
private String status;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
这是我的api电话。
Callback<com.shippn.api.models.Response<T>> callback = new Callback<com.shippn.api.models.Response<T>>() {
@Override
public void onResponse(Call<com.shippn.api.models.Response<T>> call, Response<com.shippn.api.models.Response<T>> response) {
checkStatus(response.body());
}
@Override
public void onFailure(Call<com.shippn.api.models.Response<T>> call, Throwable t) {
fail();
}
};
call.enqueue(callback);
T
参数是来自api的数据类型。我的意思是,如果您想要Post
类型Post
T
的{{1}}类型的数据。如果您想ArrayList<Post>
放ArrayList<Post>
。
如果您的api响应中data
字段为空或为空,Response.data
将为空或空,它不会引发异常。
当您从api收到回复时,首先检查Response.status
是否“成功”。如果它是“成功”,则从Response
获取数据,如果它没有采取您的错误操作。
答案 1 :(得分:0)
您可以做的是您可以拥有帖子请求的状态而不使用它。 问题是参数名称不是字符串,不会在POJO中解析。但是你可以像这样获得你的请求状态。
@Override
public void onResponse(Call<Object> call, retrofit2.Response<Object> response) {
alertDialog.dismiss();
if (response.isSuccessful() && response.body() != null) {
//if the response is received here it means it was success
}else if(response.errorBody()!=null){
//if the response is received here it means it was error
}
}
@Override
public void onFailure(Call<Object> call, Throwable t) {
//if the response is received here it means it was failure
t.printStackTrace();
}
});
修改强> 通过这种方式,您可以使用pojo获得状态,并且可以像在link
中一样解析错误编辑1 此外,为了获得正确的错误代码,您可以将回调类扩展为类似
的类public class ErrorValues {
public int code=0;
public String error;
}
然后,如果请求已完成并出现错误。内部
else if(response.errorBody()!=null){
int error=response.body.code == 404 ....
}
像这样你可以检查请求抛出了哪个错误代码。
答案 2 :(得分:0)
一种可能的方法是为模型创建一个包装器,如
public class Example<T> {
String status;
T data;
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}