Retrofit 2 - Response body null when response status is 422 (unprocessable entity)

前端 未结 3 1438
野性不改
野性不改 2021-02-19 02:37

I\'m using Retrofit to make a POST Request in my web server.

However, I can\'t seem to get the response body when the response status is 422 (unprocessable entit

相关标签:
3条回答
  • 2021-02-19 03:06

    Well in this case you'll have to convert the response. Have a look at this link

    All the steps are already provided in the link above.

    For Kotlin users here is the code solution.

    ErrorResponse.kt (This obviously depends on your error response)

    import com.squareup.moshi.Json
    
    data class ErrorResponse(
    
    @Json(name="name")
    val name: String? = null,
    
    @Json(name="message")
    val message: String? = null,
    
    @Json(name="errors")
    val errors: Errors? = null,
    
    @Json(name="statusCode")
    val statusCode: Int? = null
    )
    

    ApiFactory.kt (Let me know if you need the entire code)

    fun parseError(response: Response<*>): ErrorResponse {
        val converter = ApiFactory.retrofit()
                .responseBodyConverter<ErrorResponse>(
                        ErrorResponse::class.java, arrayOfNulls<Annotation>(0)
                )
    
        val error: ErrorResponse
    
        try {
            error = converter.convert(response.errorBody()!!)!!
        } catch (e: IOException) {
            e.printStackTrace()
            return ErrorResponse()
        }
    
        return error
    }
    

    and in the Presenter (I use MVP)

    GlobalScope.launch(Dispatchers.Main) {
            try {
                val response = ApiFactory.apiService.LOGIN(username, password)
                        .await()
                val body = response.body()
                body?.let {
                // Handle success or any other stuff
                    if (it.statusCode == 200) {
                        mView.onSuccess(it.data!!)
                    }
                } ?:
                // This is the else part where your body is null
                // Here is how you use it.
                // Pass the response for error handling
                mView.showMessage(ApiFactory.parseError(response).message!!)
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    

    And thats how you roll it! That's All Folks!

    0 讨论(0)
  • 2021-02-19 03:08

    I got the same error. My API was working using POSTMAN request but not working from Android retrofit call.

    At first I was trying using @Field but it was getting error but later I've tried with @Body and it worked.

    Sample Retrofit interface call

    @POST("api/v1/app/instance")
    Call<InstanceResponse> updateTokenValue(
            @HeaderMap Map<String, String> headers,
            @Body String body); 
    

    and API calling code is:

     Map<String, String> headerMap=new HashMap<>();
            headerMap.put("Accept", "application/json");
            headerMap.put("Content-Type", "application/json");
            headerMap.put("X-Authorization","access_token");
    
            Map<String, String> fields = new HashMap<>();
            fields.put("app_name", "video");
            fields.put("app_version", "2.0.0");
            fields.put("firebase_token", "token");
            fields.put("primary", "1");
    
            ApiInterface apiInterface = ApiClient.getApiClient().create(ApiInterface.class);
            Call<InstanceResponse> call = apiInterface.updateTokenValue(
                    headerMap,new Gson().toJson(fields));
    
    0 讨论(0)
  • 2021-02-19 03:11

    By default, when your server is returning an error code response.body() is always null. What you are looking for is response.errorBody(). A common approach would be something like this:

        @Override
        public void onResponse(Response<JsonObject> response, Retrofit retrofit) {
            if (response.isSuccess()) {
                response.body(); // do something with this
            } else {
                response.errorBody(); // do something with that
            }
        }
    

    If you need something advanced take a look at Interceptors and how to use them

    0 讨论(0)
提交回复
热议问题