问题标签 [apache-httpclient-4.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.

0 投票
0 回答
248 浏览

java - 使用 httpcomponents 通过单个连接处理多个请求?

我想使用单个连接与客户端设备进行通信。

我在保持连接有效时遇到问题。我正在使用 DefaultConnectionReuseStrategy(),它在每次请求后为 keepAlive() 返回 false,因此连接始终关闭。我已将 Connection 标头设置为 Keep-Alive,但它仍然总是关闭连接。

我的第二个问题是,如果我重写 keepAlive() 以始终返回 true,我的客户端会在读取输入流时阻塞。我该怎么处理这个?我应该阅读内容长度标题以了解要阅读的内容吗?如果没有给出内容长度怎么办?

0 投票
1 回答
6188 浏览

java - ThreadSafeClientConnManager 不是多线程

我被要求修复位于两个应用程序之间的 Servlet。其目的是将SAML授权请求与SAML v2.0 / SAML 1.1相互转换。所以:

  • 从一个应用程序接收 HTTP SAML v2.0 授权请求
  • 将请求转换为 SAML v1.1
  • 将请求发送到第二个应用
  • 从第二个应用接收 SAML v1.1 响应
  • 将响应转换为 SAML v2.0
  • 将响应发送回第一个应用程序

不要担心 SAML 的东西,问题在于 HTTP 的东西。代码完成了它的工作,但它在负载下受到很大影响。我通过测试发现,即使代码使用了ThreadSafeClientConnManager来自 Apache httpcomponents 的代码,每个到达 servlet 的请求都以单线程方式处理。更准确地说,第二次代码到达HTTPClient.execute()方法时,第一个创建连接的线程将在任何其他线程开始工作之前运行整个过程的其余部分。例如:

  • 15 个请求同时命中 servlet
  • servlet 产生 15 个线程来服务请求
  • 所有 15 个线程都检索各自的请求数据
  • 所有 15 个线程将各自的数据从 SAML v2.0 转换为 SAML v1.1
  • 线程 1 调用HTTPClient.execute()
    • 线程 1 将请求发送到第二个应用程序
    • 线程 1 接收到来自第二个应用程序的响应
    • 线程 1 解码响应并将其从 SAML v1.1 转换为 SAML v2.0
    • 线程 1 将响应发送回第一个应用程序
  • 线程 2 调用HTTPClient.execute()
  • ... 等等 ...

我已经包含了下面的代码。从我可以看到所有必要的项目都存在。任何人都可以看到任何会阻止此 servlet 同时服务多个请求的错误或缺失吗?

提前致谢!

0 投票
2 回答
12549 浏览

java - Apache HTTPClient 不建立超过 2 个连接

我一直在尝试使用 Apache HTTPClient (v4.1) 为我的应用程序实现连接池。问题是客户端在运行时总是只建立两个连接,尽管有足够多的线程并行运行。我一直在尝试修改代码一段时间,但没有任何帮助。
我正在使用ThreadSafeClientConnManager连接池并将 and 设置为MaxTotalDefaulMaxPerRoute想要的值。
你有什么首先想到的我可能想要检查的吗?

这是我用来创建客户端的代码段。

此函数返回的客户Runnables端由ThreadPoolExecutor. Runnables 使用客户端,并具有以下几行:

据我所知,EntityUtils.consume(entity)将通知连接管理器该连接不再使用,因此将释放该连接以供其他线程使用。所以我猜连接管理没问题。

我想我已经提供了足够的信息,请告诉我是否要添加更多信息。

谢谢

0 投票
1 回答
4482 浏览

java - 如何让 ThreadSafeClientConnManager 不锁定

我正在使用 httpcomponents 4.1.2 并且 ThreadSafeClientConnManager 连接不足。与旧的 commons HttpClient 不同,似乎没有任何方法可以释放连接。我的目标是让多个并发线程对 URL 进行 HTTP POST。任何人都知道如何“释放”连接?还是我应该以不同的方式来做?

我的司机是:

我的输出是:

0 投票
3 回答
17834 浏览

java - Apache HttpClient 和自定义端口

我正在使用 Apache HttpClient 4,它工作正常。唯一不起作用的是自定义端口。似乎获取了根目录并忽略了端口。

如果未定义端口,则 http- 和 https- 连接可以正常工作。方案注册表定义如下:

如何为请求定义自定义端口?

0 投票
2 回答
1054 浏览

java - Java http 客户端和线程

我正在使用 testNG 和 java http 客户端为我们的 API 编写一个快速负载测试。我的线程似乎比预期阻塞更多,所以我想确保 http 客户端正在做我认为的事情。我的基本伪代码是

所以我告诉 testNG 在 120 个线程中运行我的 @test 5000 次。我在 java 控制台中看到很多阻塞线程。这不是我的代码,但本质上是我正在做的事情的流程。我希望为我的测试生成的每个线程 testNG 也会生成一个单独的 http 客户端。如果是这样,为什么所有线程都阻塞了。

这是 jconsole 中看到的块中的典型线程堆栈:

0 投票
2 回答
2864 浏览

java - HTTPClient - 捕获所有重定向的列表

是否可以使用 HttpClient 从 URL 捕获完整的重定向历史记录?

例如,我们有 URL-A 重定向到 URL-B,最终将我们发送到 URL-C,有没有办法捕获 URL A、B 和 C 是什么?

最明显的选择是手动查找标头中的位置标记,并在达到 HTTP 200 时停止。这不是一个简单的过程,因为我们需要查找循环重定向等...

现在我假设以下内容:

将适用于这个用例吗?

0 投票
1 回答
1387 浏览

java - Solr 3.4 和 Httpclient 4

是否可以使用 DefaultHttpClient (httpclient-4.x) 配置 solrj server 3.4?

更新

我在哪里可以下载基于 httpclient-4.x 的 solrj 客户端库?

我无法从 solr svn trunk 存储库构建它(他们仍在使用 httpclient-3.x)

0 投票
2 回答
2241 浏览

coldfusion - 将 Apache HttpComponents 用于具有 NTLM 身份验证的 http 请求

快速背景。

CFHTTP 不支持 Windows NTLM/Authenticate 身份验证,仅支持基本身份验证。我需要发出必须针对 NTLM 进行身份验证的 http 请求,因此我最终推出了自己的 CFHTTP 版本。

我发现Terry Ryan 的文章使用 apache httpclient 3.1 版执行摘要身份验证,并在此基础上使用 4.1.2 版而不是包含 NTLM 功能。

我有一个函数将执行一个 get 请求,然后是其他函数来处理返回一个看起来像 cfhttp 结果集的结构。我所做的更改基于身份验证教程示例

在我更改功能以执行身份验证之前,这一切正常。

不幸的是,我现在得到:

未找到执行方法。

要么没有具有指定方法名称和参数类型的方法,要么执行方法重载了 ColdFusion 无法可靠破译的参数类型。ColdFusion 找到了 2 个与提供的参数匹配的方法。如果这是一个 Java 对象并且您验证了该方法存在,请使用 javacast 函数来减少歧义。

据我所知,HttpClient 中只有一个匹配的 execute() 函数用于传递给它的对象类,所以我有点困惑。JavaCast 不允许您强制转换为复杂对象或超类型,因此这不起作用。

谁能建议我如何让它工作?如何减少歧义?

0 投票
2 回答
9572 浏览

java - HTTPClient 4.x 连接重用没有发生

我尝试了以下 Apache http 客户端示例:

http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientMultiThreadedExecution.java

我将最大池大小设置为 5 并运行十个线程。运行此代码后,当我检查 netstat 时,我看到 10 个 TCP 连接正在打开。我期待连接被重用。为什么是这样 ?我错过了什么吗?

代码片段如下: