[英]Okhttp + Retrofit @Body request - Transfer-Encoding: chunked added
我在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);
}
});
我希望能夠發送@POST
與RequestBody
但沒有chunked
標頭...
如果我像這樣使用它,則不會添加標題:
@POST("members")
Observable<Response<Void>> createMember(@Header(X_CLIENT_AUTHORIZATION) String clientAuthorization, @Body **String** payload);
但是我想避免在發送之前將所有對象解析為String
。
有誰知道如何刪除此類請求並將對象作為純文本json發送嗎?
Transfer-encoding: chunked
當Retrofit事先不知道請求正文的完整長度時,將使用Transfer-encoding: chunked
。 IE瀏覽器。 當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());
如果在攔截器中執行此操作,則無需更改調用代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.