我在我们的一个新项目中引入了Retrofit 2。当我使用Retrofit使用Web服务响应时,我遇到了一个特殊问题。
我正在使用改装2.3.0和改装gson转换器2.3.0。
我的问题如下。 我正在使用的Web服务API将在请求为200-OK时响应2个可能的响应模型。
相信我,我知道这里的问题...如果抛出Web服务异常,Web服务不应该成功响应...它应该响应500-5xx。所有这一切都会变得容易多了。无论如何,我需要遵循这个逻辑。
这就是我所拥有的并且它正在工作但是,我认为有一个更好的方法,我不想一遍又一遍地编写相同的代码,每次我使用响应时执行强制转换操作。但是,我不确定这是哪种方法。
call.enqueue(new Callback<JsonObject>() {
@Override
public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
//cast operation
Gson gson = new Gson();
ServiceException exception = gson.fromJson(response.body(), ServiceException.class);
if(response.isSuccessful()){
if(null != exception.getCode()){
//handleException(exception);
}else{
//User authenticated successfully.
//cast operation
LoginResponseModel loginResponseModel = gson.fromJson(response.body(), LoginResponseModel.class);
//Perform actions with login response model.
//Launch dashboard if everything is ok.
Intent startDashboard = new Intent(LoginActivity.this, DashboardActivity.class);
startActivity(startDashboard);
}
}
}
@Override
public void onFailure(Call<JsonObject> call, Throwable t) {
Log.e(TAG, t.getMessage());
}
});
这是我理想的目标:
call.enqueue(new Callback<LoginResponseModel, ServiceException>() {
@Override
public void onResponse(Call<LoginResponseModel, ServiceException> call, Response<LoginResponseModel, ServiceException> response) {
if(response instanceof ServiceException){
handleException(response);
}else if(response instanceof LoginResponseModel){
//User authenticated successfully.
LoginResponseModel loginResponseModel = gson.fromJson(response.body(), LoginResponseModel.class);
//Perform actions with login response model.
//Launch dashboard if everything is ok.
Intent startDashboard = new Intent(LoginActivity.this, DashboardActivity.class);
startActivity(startDashboard);
}
}
}
@Override
public void onFailure(Call<LoginResponseModel, ServiceException> call, Throwable t) {
Log.e(TAG, t.getMessage());
}
});
我是否需要自定义Callback实现来实现我的目标? 我需要自定义响应拦截器吗? 我需要自定义响应转换器吗? 任何更好的方法的想法?
我对Retrofit有点新,我还没有找到关于这种情况的大量信息。
答案 0 :(得分:0)
嗯使用try catch
并处理gson JsonSyntaxException
怎么办?像这样:
call.enqueue(new Callback<JsonObject>() {
@Override
public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
Gson gson = new Gson();
try {
ServiceException exception = gson.fromJson(response.body(), ServiceException.class);
//handleException(exception);
} catch (JsonSyntaxException e) {
// Incorrect class, deserialize using LoginResponseModel
LoginResponseModel loginResponseModel = gson.fromJson(response.body(), LoginResponseModel.class);
//User authenticated successfully.
//Launch dashboard if everything is ok.
Intent startDashboard = new Intent(LoginActivity.this, DashboardActivity.class);
startActivity(startDashboard);
}
}
@Override
public void onFailure(Call<JsonObject> call, Throwable t) {
Log.e(TAG, t.getMessage());
}
});