Retrofit 2.0 how to get deserialised error response.body

前端 未结 21 2068
庸人自扰
庸人自扰 2020-11-28 02:46

I\'m using Retrofit 2.0.0-beta1.

In tests i have an alternate scenario and expect error HTTP 400

I would like to have retrofit.Respons

相关标签:
21条回答
  • 2020-11-28 03:29

    I currently use a very easy implementation, which does not require to use converters or special classes. The code I use is the following:

    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
        DialogHelper.dismiss();
    
        if (response.isSuccessful()) {
            // Do your success stuff...
        } else {
            try {
                JSONObject jObjError = new JSONObject(response.errorBody().string());
                Toast.makeText(getContext(), jObjError.getJSONObject("error").getString("message"), Toast.LENGTH_LONG).show();
            } catch (Exception e) {
                Toast.makeText(getContext(), e.getMessage(), Toast.LENGTH_LONG).show();
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-28 03:29

    I was facing same issue. I solved it with retrofit. Let me show this...

    If your error JSON structure are like

    {
    "error": {
        "status": "The email field is required."
    }
    }
    
    
    My ErrorRespnce.java 
    
    public class ErrorResponse {
    
       @SerializedName("error")
       @Expose
       private ErrorStatus error;
    
       public ErrorStatus getError() {
          return error;
       }
    
       public void setError(ErrorStatus error) {
          this.error = error;
       }
    }
    

    And this my Error status class

    public class ErrorStatus {
    
      @SerializedName("status")
      @Expose
      private String status;
    
      public String getStatus() {
          return status;
      }
    
      public void setStatus(String status) {
          this.status = status;
      }
    }
    

    Now we need a class which can handle our json.

      public class ErrorUtils {
    
       public static ErrorResponse parseError (Response<?> response){
          Converter<ResponseBody , ErrorResponse> converter =          ApiClient.getClient().responseBodyConverter(ErrorResponse.class , new Annotation[0]);
        ErrorResponse errorResponse;
        try{
            errorResponse = converter.convert(response.errorBody());
        }catch (IOException e){
            return new ErrorResponse();
        }
        return errorResponse;
    }
    }
    

    Now we can check our response in retrofit api call

    private void registrationRequest(String name , String email , String password , String c_password){
    
    
        final Call<RegistrationResponce> registrationResponceCall = apiInterface.getRegistration(name , email , password , c_password);
        registrationResponceCall.enqueue(new Callback<RegistrationResponce>() {
            @Override
            public void onResponse(Call<RegistrationResponce> call, Response<RegistrationResponce> response) {
    
    
    
                if (response.code() == 200){
    
    
                }else if (response.code() == 401){
    
    
                    ErrorResponse errorResponse = ErrorUtils.parseError(response);
                    Toast.makeText(MainActivity.this, ""+errorResponse.getError().getStatus(), Toast.LENGTH_SHORT).show();
                }
            }
    
            @Override
            public void onFailure(Call<RegistrationResponce> call, Throwable t) {
    
            }
        });
    }
    

    That's it now you can show your Toast

    0 讨论(0)
  • 2020-11-28 03:30

    This seems to be the problem when you use OkHttp along with Retrofit, so either you can remove OkHttp or use code below to get error body:

    if (!response.isSuccessful()) {
     InputStream i = response.errorBody().byteStream();
     BufferedReader r = new BufferedReader(new InputStreamReader(i));
     StringBuilder errorResult = new StringBuilder();
     String line;
     try {
       while ((line = r.readLine()) != null) {
       errorResult.append(line).append('\n');
       }
     } catch (IOException e) { 
        e.printStackTrace(); 
    }
    }
    
    0 讨论(0)
提交回复
热议问题