我正在使用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,我没有像文档说的那样序列化。但我认为这不是问题所在。
感谢任何帮助,谢谢。
答案 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
}
}
如果您需要真正高级的内容,请查看Interceptors和how 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));