Retrofit 2.0 how to get deserialised error response.body

前端 未结 21 2268
庸人自扰
庸人自扰 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 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 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 registrationResponceCall = apiInterface.getRegistration(name , email , password , c_password);
        registrationResponceCall.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response 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 call, Throwable t) {
    
            }
        });
    }
    

    That's it now you can show your Toast

提交回复
热议问题