如何使用可能的响应类型来使用Retrofit响应?

时间:2017-06-16 16:13:58

标签: android asynchronous retrofit2

我在我们的一个新项目中引入了Retrofit 2。当我使用Retrofit使用Web服务响应时,我遇到了一个特殊问题。

我正在使用改装2.3.0和改装gson转换器2.3.0。

我的问题如下。 我正在使用的Web服务API将在请求为200-OK时响应2个可能的响应模型。

  1. Web服务处理了请求,并使用响应回调中定义的预期响应模型进行响应。
  2. Web服务无法处理请求并将异常模型作为响应发回。仍然发送200-OK ......
  3. 相信我,我知道这里的问题...如果抛出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有点新,我还没有找到关于这种情况的大量信息。

1 个答案:

答案 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());
        }
    });