簡體   English   中英

如何在 Java 11+ HTTPClient 中分配內容長度標頭

[英]How to assign content-length header in Java 11+ HTTPClient

我正在嘗試在 Java 中分配內容長度標頭,但似乎不可能。

這是我的代碼:

        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("URL"))
                .header("Content-Type","application/pdf")
                .header("Authorization",String.format("Token token=%s",token))
                .header("Transfer-Encoding","chunked")
                .header("Content-Length",String.valueOf(contentLength))
                .POST(HttpRequest.BodyPublishers.ofByteArray(file))
                .build();

如果我運行它,那么我會得到異常“Restricted Header Name:”Content-Length”。然后我刪除了設置內容長度的行。此時我得到一個 IOException 說我的請求沒有內容長度標頭。

如果 HttpClient 拋出異常,如果我設置內容長度標頭,我該怎么設置內容長度標頭?

編輯:

我知道這不能解決問題,但我最終嘗試了非系統標准 HTTP 客戶端庫。 OkHttp 由於某種原因在我身上失敗了,但 Apache 的 HttpClient 工作正常。 它不像 Java 的內置客戶端那么優雅,但它確實有效。

(這不是真正的答案,但代碼太長無法評論)

我嘗試了這段代碼(類似於您的示例),來自 httpbin.org 的響應顯示 Java11 HTTPClient 用正確的值填充了 content-length 標頭:

public class HR {
    public static void main(String[] args) throws IOException, InterruptedException {
        byte[] file = {0, 1, 2, 3, 4, 5, 6, 7};
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://httpbin.org/anything"))
                .header("Content-Type", "application/pdf")
                .header("Authorization", "Token token=xyz")
                .header("Transfer-Encoding", "chunked")
//                .header("Content-Length", String.valueOf(file.length))
                .POST(HttpRequest.BodyPublishers.ofByteArray(file))
                .build();

        HttpClient client = HttpClient.newHttpClient();
        client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
                .thenApply(HttpResponse::body)
                .thenAccept(System.out::println)
                .join();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}

httpbin.org 的響應是(屏蔽了一些敏感字段)

{
  "args": {}, 
  "data": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Authorization": "Token token=xyz", 
    "Content-Length": "8", 
    "Content-Type": "application/pdf", 
    "Host": "httpbin.org", 
    "User-Agent": "Java-http-client/15.0.1"
  }, 
  "json": null, 
  "method": "POST", 
  "origin": "1.2.3.4", 
  "url": "https://httpbin.org/anything"
}

響應將出現兩次(一次來自異步調用,一次來自同步調用)。

因此,我不確定為什么您的代碼不發送內容長度標頭, HttpRequest.BodyPublishers.ofByteArray應該為您發送。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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