Retrofit 2 - 当响应状态为422(不可处理的实体)时,响应体为null

时间:2015-12-07 18:54:33

标签: android json post retrofit

我正在使用Retrofit在我的网络服务器中发出POST请求。

但是,当响应状态为422 (unprocessable entity)时,我似乎无法获得响应正文。响应正文始终为null

我想知道我做错了什么或是否有解决方法。因为我在使用Postman的请求中使用了相同的json,并且它正常返回正文。

这是方法:

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

正文是一个JsonObject,我没有像文档说的那样序列化。但我认为这不是问题所在。

感谢任何帮助,谢谢。

3 个答案:

答案 0 :(得分:12)

默认情况下,当您的服务器返回时,错误代码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
        }
    }

如果您需要真正高级的内容,请查看Interceptorshow to use them

答案 1 :(得分:0)

在这种情况下,您必须转换响应。 看看这个link

上面的链接中已经提供了所有步骤。

对于Kotlin用户,这是代码解决方案。

ErrorResponse.kt (这显然取决于您的错误响应)

import Grid from "@material-ui/core/Grid";

ApiFactory.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
)

演示者(我使用MVP)

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
}

这就是您的滚动方式! 那就是所有的人!

答案 2 :(得分:0)

我遇到了同样的错误。我的API使用POSTMAN请求工作,但无法通过Android改造调用工作。

起初,我尝试使用@Field,但遇到了错误,但后来我尝试使用@Body,它起作用了。

样品改造接口调用

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

并且API调用代码为:

 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));