如何根据服务器响应调整Retrofit 2.0以调用正确的模型。
即Json成功返回
{
"status": "successful",
"session_id": "123",
}
即Json返回失败
{
"status": "fail",
"message": "Wrong Email",
}
我使用http://www.jsonschema2pojo.org创建了登录模型。
然后我打电话给@FormUrlEncoded
@POST(Constant.API_LOGIN)
Call<UserLogIn> userLogin(@FieldMap Map<String, String> params);
但如果登录失败,我需要使用它:?
@FormUrlEncoded
@POST(Constant.API_LOGIN)
Call<UserLogInFalied> userLogin(@FieldMap Map<String, String> params);
我只需要GSON将响应映射到正确的模型? 任何建议如何过来/ 感谢。
答案 0 :(得分:0)
对此的一个解决方案是编写自定义反序列化器,因为您正在使用改造,我认为您可以检查这个SO Question
答案 1 :(得分:0)
为什么不让你成功的json
{
status:"successful",
message:" "
seeesion_id:"123"
}
和错误的json
{
status:"failed",
message:"wong email "
seeesion_id:"-1"
}
答案 2 :(得分:0)
创建一个像下面这样的父模型类,并在SuccessModel和ErrorModel中扩展它。
public class Model {
boolean error;
public boolean isError() {
return error;
}
public void setError(boolean error) {
this.error = error;
}}
在创建Retrofit实例之前添加以下代码:`
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor() {
@Override
public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
Request request = chain.request();
com.squareup.okhttp.Response response =chain.proceed(request);
MediaType content = MediaType.parse("Application/Json");
String res = response.body().string();
try {
JSONObject obj = new JSONObject(res);
if (obj.getString("status").equals("fail")) {
obj.put("error", true);
res = obj.toString();
}else{
return response;
}
} catch (JSONException e) {
e.printStackTrace();
}
ResponseBody b = ResponseBody.create(content, res);
return response.newBuilder().body(b).build();
}
});
现在,按如下方式编辑onResponse()方法:
@Override
public void onResponse(Response<Model> response) {
Model model = response.body();
if (model.isError()) {
ErrorModel errorModel = (ErrorModel) model;
// your code accordingly
} else {
SuccessModel successModel = (SuccessModel)model;
// your code accordingly
}
}