问题标签 [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.
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)?
java - 在 Java 11 HttpClient 中取消 http 请求
我正在尝试通过新的 Java 11 HttpClient 取消 http 请求。
这是我的测试代码:
我希望,该请求任务将在future.cancel(true);
调用线路后立即取消。因此,控制台中的最后一个打印行应该是isCancelled: true
但是,当我运行此代码时,我会看到如下内容:
这意味着,该请求任务在我取消后仍在运行……那么,这是取消请求的正确方法吗?
UPD
取消请求的正确方法是(正如丹尼尔建议的那样,+ UPD2:在cancel()
方法调用时避免 NPE):
java - 使用 HttpClient 以状态 CLOSE_WAIT 泄漏的连接
我们正在使用 JDK11 java.net.http
HTTP 客户端从 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 中工作,这样我们就不必重写代码。
websocket - 需要简单的纯 Java 11 WebSocket 客户端示例的帮助
Web 上似乎很少有 Java 11(纯 Java 非基于框架的)WebSocket客户端代码示例,所以我希望 StackOverflow 可以再次为我提供帮助。
这是我发现的最接近的,但不幸的是,在我的(新手)眼中,它似乎不是展示如何使用来自 WebSocket 侦听器的数据的完整解决方案。
查看WebSocket.Listener 实现,我认为 onText回调方法将提供我需要的东西,但我正在努力弄清楚如何从套接字返回 CompletionStage 对象和某种字符串数据。
这是我到目前为止的一些测试代码。
将不胜感激帮助。谢谢
java - 如何在 Java 11 中读取 HttpRequest 的正文?
在测试中,我想查看 HttpRequest 的主体内部。我想把身体作为一个字符串。似乎这样做的唯一方法是订阅 BodyPublisher ,但它是如何工作的?
java - 使用 HTTP Java 客户端执行异步请求时如何处理错误?
我正在使用新的 Java 11 HTTP 客户端。我有一个请求,例如:
如何为 HTTP 错误添加处理程序?我需要记录错误,但我想保持请求异步。
400
目前,像or ,这样的HTTP 错误500
是静默的。我想在这些情况下记录状态代码和响应正文。我想这CompletableFuture
就像一个承诺,所以那里还没有回复。
java - java.net.http.HttpClient 需要关闭吗?
在调用它大约 378026 次后,我正在使用新的java.net.http.HttpClient
和从我的测试中,我开始得到以下信息:
下面是我使用的类:
我不明白为什么会这样。我认为应该关闭的东西被打开了?
java - 如何使用 Java 11 HTTP 客户端为 POST 请求定义多个参数
我有一个对特定端点发出 POST 请求的代码。这段代码使用的是 Apache HttpClient
,我想开始使用HttpClient
Java(JDK11)的本机。但我不明白如何指定我的请求的参数。
这是我使用 Apache Httpclient 的代码:
和使用的代码HttpClient
:
如何设置file
和token
参数?
java - 有没有办法将 java.net.http.HttpClient 与 Oauth2 一起使用?
您好,我从 Java 11 切换RestTemplate
到HttpClient
。我也想从 Java 11 切换OAuth2RestTemplate
到HttpClient
。
我找不到任何关于使用HttpClient
OAuth2 的材料。有可能以简单的方式吗?
这是个好主意吗?或者我应该WebClient
从春天开始使用?