PythonでWeb APIを実装するFastAPIというのがあって、次のようにやればなんかサーバーがたつ。
import uvicorn from fastapi import FastAPI app = FastAPI() @app.get("/hello") def hello(): return "hello" uvicorn.run(app, host="0.0.0.0", port=8000)
そして、Java 11で導入されたHttpClientで接続しようとするとエラーになる。
var client = new HttpClient().newHttpClient(); var req = HttpRequest.newBuilder(URI.create("http://localhost:8000/hello") .get().build(); var res = client.send(req, BodyHandlers.ofString()); println(res.body());
こんな感じのエラーが返ってくる。
{"detail":[{"type":"missing","loc":["body"],"msg":"Field required","input":null}]}
でサーバー側を見るとこんなエラー
WARNING: Unsupported upgrade request. WARNING: No supported WebSocket library detected. Please use "pip install 'uvicorn[standard]'", or install 'websockets' or 'wsproto' manually. INFO: 127.0.0.1:62645 - "POST /text_embed HTTP/1.1" 422 Unprocessable Entity WARNING: Invalid HTTP request received.
pipでなんかインストールしろといってるけど、解決しない。
結局のところ、JavaのHttpClientがUpgdadeヘッダーつけてて、それでエラーになってる。
Connection: Upgrade, HTTP2-Settings Content-Length: 17 Host: localhost:8001 HTTP2-Settings: AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA Upgrade: h2c
いや、サポートしてないなら無視してよって感じがするのだけど、しかたない。
HTTP1.1を指定したら大丈夫だった。
var client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_1_1)
.build();