HTTP 1.1 没有任何机制要求服务器取消请求。可以从 HttpURLConnection
获取输入/输出/错误流并关闭它们。这将在客户端抛出 IOException
,允许客户端在取消后进行清理。 HTTP 1.1 的“持久”或“keepAlive”TCP 连接将继续存在以供将来请求使用。因此,服务器在尝试写入并失败之前不会了解客户端的这些事件。
HTTP 2 提供了一个名为 RST_STREAM
的单独框架来关闭流或取消触发的请求。由于 Java 9 HttpClient
允许我们发出返回 CompletableFuture
的异步 HTTP 请求,现在有一种使用 cancel() 取消正在进行的请求的更优雅的方法
CompletableFuture
的方法。
我的问题:
- 调用
cancel()
时,Java 9+ 版本是否真的将RST_STREAM
发送到服务器? - JEE8 是否提供任何机制来中断在收到
RST_STREAM
时针对 HTTP 请求执行的业务逻辑?或 future 版本的任何计划?
最佳答案
在 Java 11 中,要取消使用 java.net.HttpClient
的 HTTP/2 请求,您必须提供自己的 BodySubscriber
(或包装提供的构建之一-in) 并取消 Flow.Subscription
。这应该会重置 HTTP/2 流。
关于java - JEE8有没有取消HTTP 2请求处理的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54020329/