kotlin/JVMでコードを書いている時の事。MicrosoftのGraph APIを使用していました。bodyは無いコードです。Content-Length
はJava側で設定が制限されていて、手動では設定できません。
val result = HttpClient.newHttpClient() .send( HttpRequest.newBuilder(URI(url)) .header("Authorization", "Bearer $bearerToken") .method( "POST", HttpRequest.BodyPublishers.noBody() ) .build(), HttpResponse.BodyHandlers.ofString() )
GraphAPIからは以下のエラーが返ってきていました。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"> <HTML><HEAD><TITLE>Length Required</TITLE> <META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD> <BODY><h2>Length Required</h2> <hr><p>HTTP Error 411. The request must be chunked or have a content length.</p> </BODY></HTML>
HTTP2ではContent-Lengthが必須ではないようなので、HttpClientがContent-Lengthを削除しているようでした。
その為、Http1.1を明示的に指定します。
val result = HttpClient.newHttpClient() .send( HttpRequest.newBuilder(URI(url)) .header("Authorization", "Bearer $bearerToken") .method( "POST", HttpRequest.BodyPublishers.noBody() ) .version(HttpClient.Version.HTTP_1_1) .build(), HttpResponse.BodyHandlers.ofString() )
おわりに
Azure系のAPIも同じようです。
https://stackoverflow.com/questions/73361636/content-length-header-in-http-2-for-post-put-request-with-empty-body-required