簡體   English   中英

Okhttp + Retrofit @Body請求-傳輸編碼:添加了分塊

[英]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);
   }
});

我希望能夠發送@POSTRequestBody但沒有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM