首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Okhttp + Retrofit @Body request - Transfer-Encoding:添加分块

Okhttp + Retrofit @Body request - Transfer-Encoding:添加分块
EN

Stack Overflow用户
提问于 2018-01-17 17:57:18
回答 1查看 2.8K关注 0票数 1

我在Android中使用Retrofit和Okhttp时遇到了问题。问题是,当我使用带有正文负载的请求时,头Transfer-Encoding: chunked会自动添加,如下所示:

代码语言:javascript
复制
@POST("members")
Observable<Response<Void>> createMember(@Header(X_CLIENT_AUTHORIZATION) 
String clientAuthorization, @Body RequestBody payload);

然后,自动添加标头Transfer-Encoding: chunked,由于某些原因,服务器无法处理该标头。我希望正文是纯文本的json。我猜服务器会认为它是一个文件。

最糟糕的是,如果我尝试添加拦截器并使用removeHeader,这甚至不起作用。

代码语言:javascript
复制
httpClient.addInterceptor(new Interceptor() {
    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
       Request original = chain.request();
       Request.Builder requestBuilder = original.newBuilder()
               .removeHeader("Transfer-Encoding");

       Request request = requestBuilder.build();
       return chain.proceed(request);
   }
});

我希望能够发送带有RequestBody但没有chunked报头的@POST ...

如果我像这样使用它,它不会添加标题:

代码语言:javascript
复制
@POST("members")
Observable<Response<Void>> createMember(@Header(X_CLIENT_AUTHORIZATION) String clientAuthorization, @Body **String** payload);

但我希望避免在发送之前将所有对象解析为String

有谁知道如何删除这样的请求并以纯文本json的形式发送对象吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-17 23:38:57

当Retrofit事先不知道请求正文的全长时,会使用Transfer-encoding: chunked。即。当RequestBody.contentLength()返回-1时。您需要编写一些代码来将未知长度的RequestBody转换为已知长度的RequestBody。您可以这样做:

代码语言:javascript
复制
RequestBody original = ...
Buffer buffer = new Buffer();
original.writeTo(buffer);
ByteString bytes = buffer.snapshot();
RequestBody fixedLength = RequestBody.create(bytes, original.contentType());

如果在拦截器中执行此操作,则甚至不需要更改调用代码。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48298206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档