提问者:小点点

Okhttp Retrofit@Body请求-传输编码:已添加分块


我在Android中使用Retrofit和Okhttp时遇到问题。问题是当我使用带有主体有效负载的请求时,会自动添加标头Transtrans-Encode: chunked,如下所示:

@POST("members")
Observable<Response<Void>> createMember(@Header(X_CLIENT_AUTHORIZATION) 
String clientAuthorization, @Body RequestBody payload);

然后,自动添加标头Transtrans-Encode: chunked,由于某种原因服务器无法处理。我希望主体是纯文本json。我猜服务器认为这是一个文件。

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

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

我希望能够使用Request estBody发送@POST,但没有chunked标头…

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

@POST("members")
Observable<Response<Void>> createMember(@Header(X_CLIENT_AUTHORIZATION) String clientAuthorization, @Body **String** payload);

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

有人知道如何删除此类请求并以纯文本json形式发送对象吗?


共1个答案

匿名用户

Transtrans-编码:当Retrofit事先不知道请求体的完整长度时,使用chunked。即当Request estBody. contentLely()返回-1时。您需要编写一些代码将未知长度的Request estBody转换为已知长度的Request estBody。您可以这样做:

RequestBody original = ...
Buffer buffer = new Buffer();
original.writeTo(buffer);
ByteString bytes = buffer.snapshot();
RequestBody fixedLength = RequestBody.create(bytes, original.contentType());

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