如何防止 java.net.http.HttpClient 提出升级请求?

How can I prevent java.net.http.HttpClient from making an upgrade request?

从 Java 项目调用 Python rest API 时,我遇到了一个错误,指出“不支持的升级请求”。

我正在从 Java 向 Python 中写入的端点发出一个简单的 GET 请求,并且在某个时候 Java 决定请求将连接升级到一个网络套接字。我的问题是,我从来没有在我的 Java 项目中引用 websockets,当我调试并查看请求中 headers 的值时,它没有显示任何 headers所有,但在它进入网络之前的某个时刻,它决定要发出升级请求。我还没有嗅探自己的流量来确认 header 的存在;但是当我使用 OKHTTP 而不是 java.net.http.HttpClient

时,问题就不存在了

此代码导致 Python API 返回不支持的升级请求错误。

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("http://127.0.0.1:8000/"))
    .method("GET", HttpRequest.BodyPublishers.noBody())
    .build();
HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());

这段代码工作得很好

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("http://127.0.0.1:8000/")
  .get()
  .build();

Response response = client.newCall(request).execute();

有人熟悉在 java 提供的本机 HTTP 客户端中禁用升级请求吗?

请求不应升级到 websocket - 但 HttpClient 的默认设置是请求升级到 HTTP/2。

如果您不希望 HttpClient 请求升级到 HTTP/2 您可以将请求中的版本设置为 Version.HTTP_1_1,或者将 HttpClient 中的默认版本设置为 [=10] =].

参见:HttpRequest.Builder::version or HttpClient.Builder::version