我必须使用使用JSend格式的API 。
长话短说,它使用HTTP状态代码来指示状态,例如:
这很好,因为我可以据此确定我的API请求是否成功。
但:
由于JSend格式是它自己的东西,因此它在响应中还带有一个状态指示器,如下所示:
{ status : "success", data : { "post" : { "id" : 2, "title" : "Another blog post", "body" : "More content" }} }
因此,它具有一个“状态”字段,该字段还显示API请求是否成功。
问题:
进行了改进以解析对POJO的响应,因此假定响应仅包含Model,并且没有成功指示符,例如这样:(一个后期Model实例)
{ "id" : 2, "title" : "Another blog post", "body" : "More content" }
我的问题是:
有解决方案吗?我是否可以预解析状态指示器,拆分响应的“数据”(模型)部分,并对其进行改造以仅解析该部分?
如果不是这样,我将不得不向每个模型添加“状态”属性,这显然不是一种可行的方法,我不会那样做。
我应该坚持手动解析并使用ResponseBody而不是我的模型吗?
ResponseBody
void onResponse(Call<T> call, Response<T> response);对于T类型参数?
void onResponse(Call<T> call, Response<T> response);
T
因为这样可以使用.string()字符串并将其转换为JSON,然后可以手动解析模型,就像为它们编写解析器一样。
.string()
我真的很想使用Retrofit的功能来进行自动解析,因为有了JSend,我根本无法想象这将如何正确完成。
我无法更改API,它将采用这种方式。
这是我的Response课。
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类型为Postinsted的数据T。如果你想得到ArrayList<Post>放ArrayList<Post>。
Post
ArrayList<Post>
如果dataapi响应中的field为空或null,则为Response.datanull或空,则不会引发异常。
data
Response.data
当您从api获得响应时,请首先检查Response.status它是否“成功”。如果是“成功” Response,则从中获取数据,如果不是,则执行错误操作。
Response.status