アプリ開発備忘録

PlayStationMobile、Android、UWPの開発備忘録

【Microsoft Graph API】リクエストBodyが空の時にHTTP Error 411. The request must be chunked or have a content length.

kotlin/JVMでコードを書いている時の事。MicrosoftのGraph APIを使用していました。bodyは無いコードです。Content-LengthJava側で設定が制限されていて、手動では設定できません。

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