问题标签 [apache-httpclient-5.x]
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 - 如何使用 Apache HttpCient-5 Beta 正确执行 Http2
您好我正在尝试编写一个向多个服务器(已经支持 http2)发出 http2 请求的客户端。到目前为止,我已经编写了这个运行良好的独立程序,我可以看到所有请求都通过相同的 tcp 连接(在 wireshark 的帮助下验证)。我使用带有 conscrypt 的 Apache Httpclient 5 来支持 jdk8 中的 ALPN(jdk8 是我的要求,我无法升级到 jdk9 或更高版本)
主要块就像,
可运行的就像,
所以我在我的客户端中模拟了这个独立的,它使用上述逻辑异步调用多个服务器进行轮询。但是在这里我可以看到每个请求有一个 tcp 连接,并且连接在请求结束时关闭(尽管响应标头返回为 HTTP/2.0)。我使用主块代码在我的应用程序启动时初始化客户端(除了线程池部分,因为它用于独立模拟多线程环境)并创建 url、请求和响应对象并在线程模型中同时执行每个请求(异步多路复用)。我的要求是每个域使用一个 tcp 连接并长时间使用它来处理大量请求。我在这里想念什么?
或者有人用正确的方式帮助我使用 httpclient 5 处理 http2
Kindy对此有所了解。
编辑:
我追踪到两件事是异常连接关闭,
1. 每次请求后关闭连接
原因:这条线造成的
RequestConfig requestConfig = RequestConfig.custom()。setConnectTimeout(Timeout.of(15, TimeUnit.SECONDS)) ...
此 setConnectTimeout 应该处于请求级别,但在 15 秒空闲后它会关闭 tcp 连接本身,我不知道这是错误还是预期行为,因为此配置用于根据文档封装请求项。
删除此行允许 tcp 连接在请求之外保持活动状态。
2. 由于非法 HEADERS 帧/协议错误/内部错误
我可以在线路日志中看到这些异常,正是我的 tcp 连接关闭的位置(它随机关闭),我无法共享整个日志,因为有太多我只是发布了异常部分
0x0][0x1][0x0][0x0][0x4][0xffffffc9]"
2019-02-07 16:05:08,666 调试 - i/o-0000001B << 流 0 帧:WINDOW_UPDATE (0x8);标志:(0x0);长度:4
2019-02-07 16:05:08,666 调试 - i/o-0000001B << 增量 1225
2019-02-07 16:05:08,666 调试 - i/o-0000001B >> 流 0 流控制 1225 -> 65535
2019-02-07 16:05:08,666 调试 - i/o-0000001B << 流 1 帧:WINDOW_UPDATE (0x8);标志:(0x0);长度:4
2019-02-07 16:05:08,666 调试 - i/o-0000001B << 增量 1225
2019-02-07 16:05:08,666 调试 - i/o-0000001B >> 流 1 流控制 1225 -> 65535
2019-02-07 16:05:08,827 调试 - i/o-0000001B << "[0x0][0x0][0x1d][0x1][0x4][0x0][0x0][0x0][0x5]?[0xffffffe1 ]?[0xffffff88][0x1f][0x12][0xffffff96][0xffffffdf]=[0xffffffbf]J[0x1][0xffffffd5]0[0xffffff96]5[0x4][0x0][0xffffffbe][0xffffffa0]Aq[0xffffff91][ 0x10][0xffffff94][0xffffffc5][0xffffffa3][0x0][0x3]E[0x0][0x1][0x0][0x0][0x0][0x5][\n]"
2019-02-07 16:05:08,827 调试-i/o-0000001B <<“[\n]”
2019-02-07 16:05:08,827 调试 - i/o-0000001B << ""
2019-02-07 16:05:08,827 调试 - i/o-0000001B << 流 5 帧:标题(0x1);标志:END_HEADERS (0x4);长度:29
2019-02-07 16:05:08,828 调试 - i/o-0000001B << ?.?. ...=.J..0.5 3f e1 3f 88 1f 12 96 df 3d bf 4a 01 d5 30 96 35
2019-02-07 16:05:08,828 调试 - i/o-0000001B << ....Aq..... 04 00 是 a0 41 71 91 5c 10 94 c5 a3 7f
2019-02-07 16:05:08,828 调试 - i/o-0000001B >> 流 0 帧:GOAWAY (0x7);标志:(0x0);长度:29
2019-02-07 16:05:08,828 调试 - i/o-0000001B >> 最后一个流 0
2019-02-07 16:05:08,829 调试 - i/o-0000001B >> 代码 PROTOCOL_ERROR
2019-02-07 16:05:08,829 调试 - i/o-0000001B >> 非法 HEADERS 框架
2019-02-07 16:05:08,829 调试 - i/o-0000001B >> "[0x0][0x0][0x1d][0x7][0x0][0x0][0x0][0x0][0x0][0x0] [0x0][0x0][0x0][0x0][0x0][0x0][0x1]非法头帧”
2019-02-07 16:05:10,401 DEBUG - ex-0000018D:准备请求执行
和,
2019-02-07 16:17:17,519 调试 - i/o-0000000C << 流 0 帧:WINDOW_UPDATE (0x8);标志:(0x0);长度:4
2019-02-07 16:17:17,519 调试 - i/o-0000000C << 增量 1208
2019-02-07 16:17:17,519 调试 - i/o-0000000C >> 流 0 流控制 1208 -> 65535
2019-02-07 16:17:17,519 调试 - i/o-0000000C << 流 1 帧:WINDOW_UPDATE (0x8); 标志:(0x0);长度:4
2019-02-07 16:17:17,519 调试 - i/o-0000000C << 增量 1208
2019-02-07 16:17:17,519 调试 - i/o-0000000C >> 流 1 流控制 1208 -> 65535
2019-02-07 16:17:17,569 调试 - i/o-0000000C << "[0x0][0x0][0x4][0x3][0x0][0x0][0x0][0x0][0x3][0x0] [0x0][0x0][0x2]"
2019-02-07 16:17:17,569 调试 - i/o-0000000C << 流 3 帧:RST_STREAM (0x3); 标志:(0x0);长度:4
2019-02-07 16:17:17,569 调试 - i/o-0000000C << 代码 INTERNAL_ERROR
2019-02-07 16:17:17,569 调试 - i/o-0000000C >> 流 0 帧:GOAWAY (0x7); 标志:(0x0);长度:31
2019-02-07 16:17:17,569 调试 - i/o-0000000C >> 最后一个流 0
2019-02-07 16:17:17,569 调试 - i/o-0000000C >> 代码 PROTOCOL_ERROR
2019-02-07 16:17:17,569 调试 - i/o-0000000C >> 意外的流 ID:3
我不知道是什么导致了这些异常,我尝试使用静态和动态帖子正文数据,并且两者的行为相似
完整会话日志:
https://drive.google.com/open?id=12y8HnaMTrPo-NBeLaoCYpK6zklJBL56T
https://drive.google.com/open?id=16KHgqLWrwz3Z3ls3Yvpp58zOI3SUNATM
客户端:Tomcat 9.0x,Jdk 1.8.x(带有用于 ALPN 支持的 conscrypt,我们通过 TLSv1.3 连接它)在 ubuntu 16.x 上
服务器:Tomcat 9.0x(带有 openssl 实现、NIO 连接器、http2 支持)、用于 TLSv1.3 支持的 Openssl 1.1.1、Ubuntu 14.x 上的 JDK 10.0.2
任何帮助将不胜感激
TIA
java - 如何从 apache http 客户端响应中删除服务器/软件信息
我写了下面的示例程序来检查http的响应
输出/响应如下
现在我想知道如何从该响应中删除如下软件信息
java - GET 请求上的 I/O 错误 --Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
我在从 JAVA 代码中访问 API 时遇到了问题
以下是此日志
我可以通过 POSTMAN 使用 API,但在使用 java 代码时遇到问题。
java-8 - 在纯文本连接器上启用 HTTP/2
在启用 HTTP/2 的 Jetty 文档之后,
我到达了以下步骤,
2015-06-17 14:16:12.549:INFO:oejs.ServerConnector:main: 启动 ServerConnector@6f32cd1e{HTTP/1.1,[http/1.1, h2c]}{0.0.0.0:8080}
从文档中,
目前没有主流浏览器支持纯文本 HTTP/2,因此 8080 端口只能与使用升级机制或假定 HTTP/2的特定客户端(例如 curl)一起使用 HTTP/2。
文档提到了“特定客户”,但我可以使用什么客户来克服这个问题?我试过okHttp
and apache-httpclient
,okHttp
不支持升级机制(AFAIK,如果不是这样就好了),并且apache-httpClient
不支持h2
.
我基本上需要从我的程序向这个端点发出 GET/POST 请求(显然,使用 HTTP/2)。
简单来说,请推荐任何支持非加密 http/2 (h2c) 的 Java 客户端
谢谢!
java - 使用单个 Apache HttpClient 实例向多个主机发出多个同步请求(>500 个请求)
我需要同时向多个主机发出多个 GET 请求。最小请求数为 500。我可以使用单个 Apache HttpClient 实例来发出所有请求吗?还是我需要为每个请求创建一个新请求?任何其他方法/库也可以使用。
java - 如何使用 Conscrypt 和 Apache HttpClient 5 来加速 TLS
将 Conscrypt 与 Apache HttpClient 5 一起使用的推荐方法是什么?
我尝试将conscrypt-openjdk-uber-2.2.1.jar
jar 添加到我的类路径并配置我sslcontext
的 as SSLContexts.custom().setProvider(Conscrypt.newProvider())
,但是当我用它测试 HttpClient 时,sslcontext
它会抛出:
如果我删除自定义setProvider
行,那么它可以完美运行(通过常规 JSSE)。
我注意到 Conscrypt 在这里被列为依赖项:https ://hc.apache.org/httpcomponents-client-5.0.x/httpclient5/dependencies.html ,所以也许我需要启用对 Conscrypt 的内置支持某处?
java - 如何使用 Apache HttpClient 5 启用线路日志记录
配置 Log4j 2 的最简单方法是通过 log4j2.xml 文件。当 Log4j 2 位于应用程序类路径的根目录时,Log4j 2 将使用名为 log4j2.xml 的文件自动配置自身。
然后给出了可以使用的 XML 示例。这些示例都不起作用,也不会打印任何调试信息。
这个答案说这可以通过将 log4j-core 和 log4j-1.2-api jar 添加到类路径来解决。我添加了 log4j-core-2.9.1.jar 和 log4j-1.2-api-2.9.1.jar 但这并不能解决问题。我正在使用 httpcomponents-client-5.0-beta7 和 httpcomponents-core-5.0-beta11。
我究竟需要使用哪些 jar,以及我需要做哪些配置?
java - Apache HTTP 客户端 - Apache Http 客户端中 0 个租用连接的问题
我正在尝试在我们的模块中使用 PoolingHttpClientConnectionManager。
下面是我的代码片段
我收到的输出如下:
尽管有请求正在执行,但我无法找到我的租用连接始终为 0。此外,尽管我已经注册了路线,但路线始终显示为 0。在我看来,有一些问题,但我无法识别它。执行期间可用连接也显示为 0(尽管此处未打印)。请帮助我找出问题所在。谢谢!
apache-httpcomponents - Apache Http 异步客户端的内容 GZIP 解压缩
在经典的HttpClient
GZIP 解压缩中,由ContentCompressionExec
. 这是如何完成的HttpAsyncClient
?我找不到任何AsyncExecChainHandler
实现此功能的东西。
java - Apache HttpClient 未显示响应的 Content-Length 和 Content-Encoding 标头
我安装了Apache httpcomponents-client-5.0.x并且在查看 http 响应的标头时,我很震惊它没有显示Content-Length
和Content-Encoding
标头,这是我用于测试的代码
无论我尝试什么,我都会得到相同的结果,就像这样
或这个
根据6 年前提出的这个问题,即使使用旧版本的 Apache HttpClient,这似乎也是一个老问题。
当然,服务器实际上是在返回 Wireshark 确认的这些标头,并且 Apache HttpClient 会自行记录
顺便说一句,java.net.http
被称为库的JDK HttpClient
作品很棒并显示所有标题。
我做错了什么,还是应该报告一个存在多年的错误?