问题标签 [java-http-client]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
9704 浏览

java - How to handle HTTP/2 GOAWAY with HttpClient?

I am trying to continuously send GET and POST requests to a REST API every few minutes. The issue is that after exactly 1000 requests I receive a GOAWAY frame (and an IOException):

The GOAWAY frame (type=0x7) is used to initiate shutdown of a connection or to signal serious error conditions.
HTTP/2 spec


I did a fair bit of research and found that not only is 1000 requests nginx's default maximum, Cloudfront (related Chromium issue) and Discord also exhibit the same behavior.

I tried to reproduce this problem with a local nginx server with the default HTTP/2 configuration:

And after approximately 1000 requests, I get a GOAWAY error as expected:


My first thought would be to check if the exception message contains the string "GOAWAY" and then retry the request accordingly:

My issue with this approach is that the string comparison seems like it may be fragile. Additionally, since all I have is an IOException with a message, I can't differentiate between GOAWAY frames with a genuine error code (in which case I should probably stop sending requests) and those with NO_ERROR (in which case I could probably retry the request).

How should I correctly deal with/handle GOAWAY errors (apart from using HTTP/1.1 instead)?

0 投票
3 回答
3793 浏览

java - 在 Java 11 HttpClient 中取消 http 请求

我正在尝试通过新的 Java 11 HttpClient 取消 http 请求。

这是我的测试代码:

我希望,该请求任务将在future.cancel(true);调用线路后立即取消。因此,控制台中的最后一个打印行应该是isCancelled: true

但是,当我运行此代码时,我会看到如下内容:

这意味着,该请求任务在我取消后仍在运行……那么,这是取消请求的正确方法吗?

UPD

取消请求的正确方法是(正如丹尼尔建议的那样,+ UPD2:在cancel()方法调用时避免 NPE):

0 投票
2 回答
8655 浏览

java - 使用 HttpClient 以状态 CLOSE_WAIT 泄漏的连接

我们正在使用 JDK11 java.net.httpHTTP 客户端从 API 获取数据。在我们收到响应后,连接在我们的服务器中仍然以 TCP 状态打开CLOSE_WAIT,这意味着客户端必须关闭连接。

来自RFC 793术语:

CLOSE-WAIT - 表示等待来自本地用户的连接终止请求。

这是我们的客户端代码,它在 WildFly 16 上运行,在 Java 12 上作为无状态 REST API 运行。我们不明白为什么会这样。

我们得到“状态码”,表示 http 响应已处理。

当使用相同的代码调用其他端点时,连接很好。这似乎是我们正在调用的远程 API 的一个特殊问题,但我们仍然不明白为什么 Java HTTP 客户端保持连接打开。

我们尝试了 Windows 和 Linux 机器,甚至尝试了 WildfFly 之外的独立机器,但结果相同。在每次请求之后,即使是从我们的无状态客户端执行并接收响应,每个请求都将保持不变CLOSE_WAIT并且永远不会关闭。

如果我们关闭 Java 进程,连接将消失。

在此处输入图像描述

HTTP 客户端发送的标头:

服务器返回带有标题的响应:Connection: close

更新 (1)

我们尝试微调实现类中的池参数jdk.internal.net.http.ConnectionPool

它没有解决问题。

更新 (2)

使用Apache HTTP时,连接会处于 CLOSE_WAIT 状态大约 90 秒,但在那之后它可以连接。

调用方法HttpGet.releaseConnection()强制连接立即关闭。

并且使用OkHttp客户端,它可以按预期开箱即用,没有连接卡住。

我们仍在努力寻找如何让它在 java-http-client 中工作,这样我们就不必重写代码。

0 投票
2 回答
6240 浏览

websocket - 需要简单的纯 Java 11 WebSocket 客户端示例的帮助

Web 上似乎很少有 Java 11(纯 Java 非基于框架的)WebSocket客户端代码示例,所以我希望 StackOverflow 可以再次为我提供帮助。

是我发现的最接近的,但不幸的是,在我的(新手)眼中,它似乎不是展示如何使用来自 WebSocket 侦听器的数据的完整解决方案。

查看WebSocket.Listener 实现,我认为 onText回调方法将提供我需要的东西,但我正在努力弄清楚如何从套接字返回 CompletionStage 对象和某种字符串数据。

这是我到目前为止的一些测试代码。

将不胜感激帮助。谢谢

0 投票
1 回答
3285 浏览

java - 如何在 Java 11 中读取 HttpRequest 的正文?

在测试中,我想查看 HttpRequest 的主体内部。我想把身体作为一个字符串。似乎这样做的唯一方法是订阅 BodyPublisher ,但它是如何工作的?

0 投票
1 回答
3045 浏览

java - 将 Java 9 HttpClient 代码升级到 Java 11:BodyProcessor 和 asString()

我有一个代码库(显然)可以Java 9Java 11. 它使用jdk.incubator.httpclientAPI 并根据答案更改模块信息在大多数情况下有效,但不仅仅是包已更改。

我仍然无法修复的代码如下:

编译错误是:

如何将代码转换为等效Java 11版本?

0 投票
1 回答
2531 浏览

java - 使用 HTTP Java 客户端执行异步请求时如何处理错误?

我正在使用新的 Java 11 HTTP 客户端。我有一个请求,例如:

如何为 HTTP 错误添加处理程序?我需要记录错误,但我想保持请求异步。

400目前,像or ,这样的HTTP 错误500是静默的。我想在这些情况下记录状态代码和响应正文。我想这CompletableFuture就像一个承诺,所以那里还没有回复。

0 投票
1 回答
1902 浏览

java - java.net.http.HttpClient 需要关闭吗?

在调用它大约 378026 次后,我正在使用新的java.net.http.HttpClient和从我的测试中,我开始得到以下信息:

下面是我使用的类:

我不明白为什么会这样。我认为应该关闭的东西被打开了?

0 投票
2 回答
5229 浏览

java - 如何使用 Java 11 HTTP 客户端为 POST 请求定义多个参数

我有一个对特定端点发出 POST 请求的代码。这段代码使用的是 Apache HttpClient,我想开始使用HttpClientJava(JDK11)的本机。但我不明白如何指定我的请求的参数。

这是我使用 Apache Httpclient 的代码:

和使用的代码HttpClient

如何设置filetoken参数?

0 投票
1 回答
1214 浏览

java - 有没有办法将 java.net.http.HttpClient 与 Oauth2 一起使用?

您好,我从 Java 11 切换RestTemplateHttpClient。我也想从 Java 11 切换OAuth2RestTemplateHttpClient

我找不到任何关于使用HttpClientOAuth2 的材料。有可能以简单的方式吗?

这是个好主意吗?或者我应该WebClient从春天开始使用?