我在Android中使用Retrofit和Okhttp时遇到了问题。问题是,当我使用带有正文负载的请求时,头Transfer-Encoding: chunked会自动添加,如下所示:
@POST("members")
Observable<Response<Void>> createMember(@Header(X_CLIENT_AUTHORIZATION)
String clientAuthorization, @Body RequestBody payload);然后,自动添加标头Transfer-Encoding: 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);
}
});我希望能够发送带有RequestBody但没有chunked报头的@POST ...
如果我像这样使用它,它不会添加标题:
@POST("members")
Observable<Response<Void>> createMember(@Header(X_CLIENT_AUTHORIZATION) String clientAuthorization, @Body **String** payload);但我希望避免在发送之前将所有对象解析为String。
有谁知道如何删除这样的请求并以纯文本json的形式发送对象吗?
发布于 2018-01-17 23:38:57
当Retrofit事先不知道请求正文的全长时,会使用Transfer-encoding: chunked。即。当RequestBody.contentLength()返回-1时。您需要编写一些代码来将未知长度的RequestBody转换为已知长度的RequestBody。您可以这样做:
RequestBody original = ...
Buffer buffer = new Buffer();
original.writeTo(buffer);
ByteString bytes = buffer.snapshot();
RequestBody fixedLength = RequestBody.create(bytes, original.contentType());如果在拦截器中执行此操作,则甚至不需要更改调用代码。
https://stackoverflow.com/questions/48298206
复制相似问题