Подтвердить что ты не робот

Дооснащение 2 - Тело ответа недействительно, когда статус ответа равен 422 (необработанный объект)

Я использую Retrofit, чтобы сделать запрос POST на моем веб-сервере.

Тем не менее, я не могу получить тело ответа, когда статус ответа 422 (unprocessable entity). Тело ответа всегда равно null.

Я хочу знать, делаю ли я что-то не так или есть ли обходной путь для этого. Потому что я использую тот же JSON в запросе с Почтальоном, и он возвращает тело нормально.

Это метод:

@Headers("Content-Type: application/vnd.api+json")
@POST("my_endpoint")
Call<JsonObject> postEntry(@Header("Authorization") String authorization, @Body JsonObject json);

Тело - это JsonObject, я не сериализую, как сказано в документации. Но я не думаю, что это проблема.

4b9b3361

Ответ 1

По умолчанию, когда ваш сервер возвращает код ошибки, response.body() всегда имеет значение null. То, что вы ищете, это response.errorBody(). Общий подход будет примерно таким:

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

Если вам нужно что-то действительно продвинутое, посмотрите на перехватчики и как их использовать

Ответ 2

Ну, в этом случае вам придется преобразовать ответ. Посмотрите эту ссылку

Все шаги уже приведены в ссылке выше.

Для пользователей Kotlin здесь есть кодовое решение.

ErrorResponse.kt (это, очевидно, зависит от вашего ответа об ошибке)

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 (дайте мне знать, если вам нужен весь код)

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
}

и в Presenter (я использую 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()
        }
    }

И вот как вы это катите! Это все люди!