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实现统一添加请求参数和重定向

从 retrofit2 响应中获取 JSONObject

Android 使用Retrofit2.0+OkHttp3.0实现缓存处理+Cookie持久化第三方库

OkHttp3 + retrofit2 封装