问题标签 [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 投票
0 回答
2988 浏览

java - Java 11 连接重置(间歇性)

我正在使用Java11并向httpclient 4.5.11API 发出请求,到目前为止一切正常。但是一个多星期前,付款https://api.moip.com.br开始出现间歇性错误(Connection reset)。

我知道他们需要 TLSv1.2 并且 Java11 支持它,而且错误是间歇性的(有时它有效,有时它不支持)。我联系了他们,他们说他们迁移了他们的代码库,但是他们处理请求的配置是相同的,我对此表示怀疑,但无论如何,考虑到他们处理多个组织的付款,我认为有一些东西我可以做些什么来避免这些错误。作为旁注,我可以毫无问题地向 PayPal、Stripe、Google Recaptcha 等服务提出请求。

我如何创建连接:

以下是我如何创建连接管理器、客户端构建器和请求本身:

SimpleHttpClientRequest只是我的一个类,它定义了发出请求时要使用的 uri、headers 和其他数据,但请求本身是由 apache HttpClient 完成的。

就像我说的那样,错误是间歇性的,如果我尝试多次提出相同的请求,它就会起作用。

我定义-Djavax.net.debug=all知道可能是什么情况,日志如下:

Obs:我删除了类似的行,ERROR [stderr] (default task-2) 0000: D2 A3 F4 C9 87 BF 23 89 65 F7 50 B6 90 8C 9D 8B ......#.e.P.....因为我认为在这种情况下它们不会添加任何有用的东西

当我收到错误时:

当它出错时,它不会到达成功请求中记录的部分:

我看到了SocketTimeoutException(即使在请求开始后仅 200 毫秒发生)并尝试在连接管理器以及客户端构建器以及请求中增加套接字超时,但它没有工作。我还尝试删除keepalive并使其不被重用,但它也没有工作。我还在这里查看了类似问题的其他问题,但没有一个有效。以下是我尝试的更改:

在连接管理器中:

在客户端:

在请求中:

我一起尝试了上述方法,也尝试了单独的方法,但都没有奏效。

我意识到,在本地测试时启动 java 应用程序后我从未收到异常(可能是巧合,很难),当请求有效时,以下请求工作 1 分钟左右,但即使我定义为不重用连接它以相同的方式继续,出现间歇性错误,并且如果一个请求成功则工作一段时间(尽管该配置可能没有禁用连接的重用,但我认为它已禁用,因为我看到了带有 的日志connectionReuse strategy returning false),所以我最终没有选择。

现在我将它们包含在一个while最多执行 4 次(当它出错时)的循环中,以使对该特定端点的请求对用户无缝工作,但这是一种非常 hack 的方法,我想解决这个问题,如果可能的。

我希望有人可以帮助我。

0 投票
1 回答
1120 浏览

java - java.net.HttpClient 上是否有任何连接池处理?

我想使用 Java 11 HttpClient 并使用 HTTP 1.1 的 Keep-Alive 参数在同一地址上发送多个请求。我知道 Apache HTTP 客户端有类似的功能,但是 Java API 的客户端有类似的功能吗?

0 投票
1 回答
595 浏览

java - 如何使用 Java 11 HttpClient 发布字符串数组?

尝试调用一个接受两个 POST 参数的接口:

  • 参数1:字符串
  • 参数2:数组[字符串]

我尝试Array<String>仅以字符串形式发布显然是幼稚的,但找不到更好的方法。使用 Java 11 本机 HttpClient 使用字符串数组发布参数的正确方法是什么?

0 投票
1 回答
991 浏览

java - 使用 Java 11 和 Spring Boot 调用 java.net.http.HttpClient 的响应不可靠

我正在 Spring Boot 中编写一个后端应用程序,该应用程序从第三方调用另一个 API。

我遇到了这个特定调用的问题,它检索包含承载令牌的令牌对象,然后我在他们的其他端点中使用它。在调用其他端点时,检索到的令牌有时会起作用,但大多数时候不会,从而导致未经授权的响应。

这是一个示例令牌对象:

使用邮递员检索令牌工作得非常好,所以它不会是第三方 API 的问题。我也在.NET Core 3 中实现了同样的服务,它在那里也能正常工作。

最让我困惑的是,实际的 HttpClient 调用有效,我确实得到了一个正确的 Json,它很好地映射到了我的 TokenResponse 对象。只是令牌值无效......有时。

我也尝试过使用 RestTemplate 和 WebClient Spring 库,但结果是一样的。通话有效,但检索到的令牌无效。

起初我以为我遇到了竞争条件,因为最初我在那里有另一个 HttpClient 和另一个端点,使用来自令牌调用的响应。因此,我将其简化为仅令牌调用,并将令牌值手动复制到邮递员请求中。没用。

然后我想也许我的 HttpClient 授权标头格式不正确,但这已被证明是错误的,因为只需使用邮递员请求将令牌复制到受保护的端点就表明该令牌不起作用。

以及我尝试过的其他事情:

  • 将我在控制器中生成的表单字符串粘贴到 Postman 请求中以确保它有效。
  • 检查 URLEncoder 没有弄乱任何表单值。
  • 从令牌对象复制令牌值,以便在 Postman 的另一个端点中使用。
  • 跳过对象映射并返回一个简单的字符串,并从 Postman 的响应中手动复制令牌值,以便我可以在另一个端点中使用它。

在这一点上我很迷茫,唯一想到的是,也许 HttpClient.send() 方法可能正在以一种可能会影响内容的方式解析正文?我对此表示怀疑,但我看不出还会发生什么。

0 投票
2 回答
5069 浏览

java - 重试 HTTP 请求 (Java 11 - HttpClient)

问题

使用HttpClientJava 11(JDK,而不是 Apache),如何重试请求?

假设如果请求没有返回状态代码或抛出异常,我想重试最多10 次。200


试图

目前,我正在循环重新安排返回的未来,我想知道是否有更好或更优雅的方式。

如果我们也为特殊情况添加重试,我最终会得到

不幸的是,似乎没有任何composeAsync触发因素,定期完成和例外。有handleAsync但没有compose,lambda 需要返回U而不是CompletionStage<U>那里。


其他框架

为了质量保证,我也对展示如何使用其他框架实现这一目标的答案感兴趣,但我不会接受它们。

例如,我见过一个名为Failsafe的库,它可能为此提供了一个优雅的解决方案(请参阅jodah.net/failsafe)。


参考

作为参考,这里有一些相关的 JavaDoc 链接:

0 投票
1 回答
2393 浏览

java - JDK11 HttpClient 双向 tls

我正在寻找使用java 11 中提供的新 HttpClient。目前尚不清楚如何进行双向 TLS(2 路身份验证,客户端和服务器都提供证书。)

有人可以提供一个带有 HttpClient 的双向 TLS 示例吗?

0 投票
1 回答
1528 浏览

java - 如何为 Java 11 HttpRequest 创建自定义 BodyPublisher

我正在尝试创建一个BodyPublisher可以反序列化我的 JSON 对象的自定义。我可以在创建请求并使用ofByteArray方法时反序列化 JSON,BodyPublishers但我宁愿使用自定义发布者。

此实现有效,但request前提是使用 1 作为参数调用订阅方法。但这就是当我将它与 HttpRequest 一起使用时发生的情况。

我很确定这不是创建自定义订阅的任何首选或最佳方式,但我还没有找到更好的方法来使它工作。

如果有人能带领我走上更好的道路,我将不胜感激。

0 投票
0 回答
870 浏览

java - Java 11 HttpClient 间歇性挂起

我正在使用 Java 11 的HttpClient. 客户端间歇性挂起,我不知道为什么——我不知道是什么导致了挂起,也不知道如何重现它。

构建客户端和请求的代码位于不同的位置,因此此摘要显示了它们是如何构建的:

最初,我所知道的只是我的服务被挂起——我不知道HttpClient参与其中。然后,我在后台线程中扔了一个看门狗计时器,该线程持有对主工作线程的(弱)引用,这样如果计时器到期,我可以获得主工作线程正在做什么的堆栈跟踪。这给了我这个堆栈跟踪(五分钟后过期):

从那以后,我已经看到其中一些超时发生在所有使用的代码的不同部分中HttpClient,都产生相同的堆栈跟踪。

我知道HttpClient可以追溯到 Java 9 的错误可能会导致挂起,但我们正在上个月(IIRC)的 Java 11 版本上运行,并且我读过的所有错误都早在那之前就已修复。

关于可能导致此问题的原因,或如何重现或进一步调试它的任何建议?

0 投票
2 回答
659 浏览

java - 在 Tomcat 中使用 net.http.HttpClient 会导致内存泄漏

我在HttpClient基于 Servlet 的 Web 应用程序中使用 Java 的新版本(自版本 11 起):

一切都很好,除了在 Tomcat 上重新启动 Web 应用程序时会产生以下警告:

我怎样才能防止这种情况?我尝试使用ThreadFactory只返回守护线程的自定义:

但警告仍然存在。

我在 Tomcat 9 上使用 OpenJDK 11.0.7。

0 投票
2 回答
1059 浏览

server-sent-events - SSE Java 11+ 客户端示例(无依赖项)

我正在寻找使用普通 JDK11+ http 客户端读取服务器发送事件的示例,没有额外的依赖项。我在文档中也找不到任何关于 sse的信息。

有什么提示吗?