Retrofit2 OkHttp3 响应正文空错误
Posted
技术标签:
【中文标题】Retrofit2 OkHttp3 响应正文空错误【英文标题】:Retrofit2 OkHttp3 Response Body Null Error 【发布时间】:2017-10-28 06:49:48 【问题描述】:我正在使用 Retrofit 2 调用一个微服务,该微服务在 PUT 方法上返回一个 200 和一个空响应体。 然而,改造 2 似乎无法处理这个问题,并且在“入队”中转到 onFailure 分支 @覆盖 public void onFailure(Call call, Throwable t)
这里是日志:
Mai 27, 2017 3:26:49 PM okhttp3.internal.platform.Platform log
INFORMATION: --> PUT http://127.0.0.1/test/ http/1.1
Mai 27, 2017 3:26:49 PM okhttp3.internal.platform.Platform log
INFORMATION: Content-Type: application/vnd.tipico.notification-v1+json
Mai 27, 2017 3:26:49 PM okhttp3.internal.platform.Platform log
INFORMATION: Content-Length: 87
Mai 27, 2017 3:26:49 PM okhttp3.internal.platform.Platform log
INFORMATION:
Mai 27, 2017 3:26:49 PM okhttp3.internal.platform.Platform log
INFORMATION: "state":"ACTIVE","externalId":"abcd","loginName":"gsdfgsdf","updatedAt":1495531062000
Mai 27, 2017 3:26:49 PM okhttp3.internal.platform.Platform log
INFORMATION: --> END PUT (87-byte body)
Mai 27, 2017 3:26:50 PM okhttp3.internal.platform.Platform log
INFORMATION: <-- 200 http://127.0.0.1/test/ (197ms)
Mai 27, 2017 3:26:50 PM okhttp3.internal.platform.Platform log
INFORMATION: X-Application-Context: customer-care-notification-service:49980
Mai 27, 2017 3:26:50 PM okhttp3.internal.platform.Platform log
INFORMATION: Content-Length: 0
Mai 27, 2017 3:26:50 PM okhttp3.internal.platform.Platform log
INFORMATION: Date: Sat, 27 May 2017 13:26:49 GMT
Mai 27, 2017 3:26:50 PM okhttp3.internal.platform.Platform log
INFORMATION: <-- END HTTP (0-byte body)
15:26:50,030 ERROR com.test.app.Test - Failed CCNS call com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
at [Source: okhttp3.ResponseBody$BomAwareReader@9eb187b; line: 1, column: 0]
有人知道这是什么原因吗?由于请求已成功处理(见上文)。
【问题讨论】:
这很奇怪。您的调用是否返回任何改造可能尝试反序列化的对象?通过调用我的意思是 java 接口 您找到解决方案了吗?我面临同样的问题。看起来这发生在一些杰克逊版本中。您使用的是哪个版本? 嗨,是的,你需要像这里一样实现 NullOnEmptyConverterFactory github.com/square/retrofit/issues/1554 How can I handle empty response body with Retrofit 2?的可能重复 【参考方案1】:我为此问题创建了一个 Null 处理程序转换器:
public class NullOnEmptyConverterFactory extends Converter.Factory
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit)
final Converter<ResponseBody, ?> delegate = retrofit.nextResponseBodyConverter(this, type, annotations);
return (Converter<ResponseBody, Object>) body ->
if (body.contentLength() == 0) return null;
return delegate.convert(body);
;
您需要在 Gson 转换器之前添加此转换器
.addConverterFactory(new NullOnEmptyConverterFactory())
【讨论】:
以上是关于Retrofit2 OkHttp3 响应正文空错误的主要内容,如果未能解决你的问题,请参考以下文章
Retrofit2 和 OkHttp3 仅在发生错误时使用缓存,例如网络错误或达到配额限制
Retrofit 2.0 - 如何获取 400 Bad Request 错误的响应正文?
关于Retrofit2+Okhttp3实现统一添加请求参数和重定向