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

java - 如何将基于多个条件的标头添加到 HttpRequest Java 11?

我正在学习java.net.http api,试图下载一个给定已下载字节范围的文件。为此,range可以使用标头(假设服务器支持此类功能)。

使用org.apache.http.client.methods.HttpGet我可以做到这一点:

现在使用 HttpRequest 我无法动态添加新标头,我必须创建一个新的整个 HttpRequest:

我有办法动态添加它们吗?

我看到文档说:

一旦构建,HttpRequest 是不可变的,并且可以多次发送。

但是不可变有什么意义呢?如果我出于任何原因需要修改标题怎么办?

参考:

https://openjdk.java.net/groups/net/httpclient/intro.html

0 投票
1 回答
370 浏览

java - Java 11 HttpClient 不允许以冒号开头的标头

我正在尝试发送带有名为“:path”的标头的POST请求(HTTP / 2),但看起来Java 11中的HttpClient不允许以冒号开头的标头。

这个标头使用 HTTP/2 应该没问题。

这就是我的代码的样子:

难道我做错了什么?

0 投票
2 回答
1855 浏览

basic-authentication - 如何使用 Java 11 HTTP 客户端进行抢先式身份验证?

我正在尝试使用基本身份验证对经过身份验证的服务使用 Java 11 HTTP 客户端。身份验证成功发生,但它对服务器进行了额外的往返,以了解它应该发送身份验证数据。

已经搜索了文档和代码,并且在内部的某个时候它使用了某种缓存,但我无法设置缓存值。

这是我的客户代码:

我所期望的是,我可以以某种方式告诉客户端抢先发送身份验证数据,而不仅仅是在服务器请求时。

0 投票
0 回答
179 浏览

java - 具有名称解析更新和主动监控的弹性 HTTP 客户端

我正在尝试基于它构建一个 HTTP 客户端,java.net.http.HttpClient并且我希望对在后台解析的 IP 地址进行一些控制。

我希望这种机制使用请求主机后面的所有 IP 地址。我试图解决的根本问题是尽快对目标 IP 的不可用做出反应。这可以通过对每个 IP 进行主动监控并在发送 HTTP 请求时仅使用可用地址(在 TCP、TLS 或 HTTP 级别)来完成。我还想对所有 IP 之间的流量进行负载平衡,并主动检测 DNS 解析的变化。我正在维护与外部 HTTPS 服务的长期连接。

目前,HTTP java 客户端仅使用一个 IP 地址,并维护连接池以针对该 IP。

通过使用提供给 HTTP 客户端的 URL 中的 IP 地址并使用与预期名称匹配的特定信任管理器来保持 TLS 验证,我已经构建了一个解决方法。它有几个限制。特别是它会更改 HTTP 请求,这可能会影响您收到的响应,具体取决于您的目标服务器。它还强制按您要定位的主机使用一个 HTTP 客户端。我创建了一个小型GitHub 存储库来说明此解决方法。

我探索了一点 HTTP 客户端实现,到目前为止我还没有找到任何方法来实现这种机制。特别是,我被困在jdk.internal.net.http.HttpRequestImpl#getAddress哪个包可见并阻止任何扩展。

这种机制存在于 Jetty HTTP 客户端(请参阅 参考资料org.eclipse.jetty.util.SocketAddressResolver)或 HTTP Apache 客户端中。

有没有我可以用来正确解决此类问题的现有机制?如果没有,有没有办法贡献或提交改进请求?

0 投票
1 回答
5601 浏览

java - 带有 PATCH 方法的 Java 11 HttpRequest

我尝试使用 java 11HttpRequest使用 PATCH 方法调用 msgraph webservice:

错误 :

方法没有签名:jdk.internal.net.http.HttpRequestBuilderImpl.PATCH() 适用于参数类型:(jdk.internal.net.http.RequestPublishers$StringPublisher) 值:[jdk.internal.net.http.RequestPublishers$ StringPublisher@280a600b]

调用本身效果很好,例如在 Postman 中。但我不能让它在 groovy/java 中工作。

我以前使用过,HttpUrlConnection但它不支持PATCH。它实际上可以使用HttpRequest吗?

我在网上找不到任何使用 PATCH 方法的工作示例。

0 投票
1 回答
3127 浏览

java - 如何测试 java.net.http (Java 11) 请求 BodyPublisher?

我正在尝试测试使用新 Java 11 的代码java.net.http.HttpClient

在我的生产代码中,我有这样的东西:

在我的测试中,我模拟了HttpClient,所以得到了java.net.http.HttpRequest. 如何获取/测试其请求正文(= my "example")?我可以打电话request.bodyPublisher()得到一个HttpRequest.BodyPublisher,但后来我被卡住了。

  • 我试图将它转换为jdk.internal.net.http.RequestPublishers.ByteArrayPublisher(它实际上是),但它不会编译,因为相应的包不是由模块导出的。
  • 我已经检查了HttpRequest.BodyPublisher-interface ( .contentLength(), .subscribe(subscriber)) 中的可用方法,但我想它们不可能。
  • 我试图创建一个新的BodyPublisher并使用 比较它们.equals(),但没有真正的实现,所以比较总是错误的。
0 投票
2 回答
690 浏览

java - 如何在 Java 的 Native HTTP Client 上使用代理密码认证

如果代理需要 Java 的本机 HTTP 客户端请求,我正在尝试使用密码身份验证。

我尝试了很多东西,适用于我的程序的最常见的解决方案是

但在那之后,我在发送请求时仍然收到错误 407(在 IP Authenticated 代理上工作正常)。该代理在通过 Chrome 扩展程序运行它的浏览器上运行良好。

0 投票
1 回答
161 浏览

java - 在不构建新的 HTTP 客户端的情况下更改 Java 的本机 HTTP 客户端的代理

我有一个无限循环的刮板,我想更改客户端上的代理,以防出现 IP 禁令(403 状态代码)之类的错误,或者我只想在每次循环后更改代理以避免禁令完全地。

这个问题,特别是后一种情况,最终程序在达到允许的最大连接数时崩溃(java.net.SocketException:没有可用的缓冲区空间(达到最大连接数?))。

有没有办法在不构建新代理的情况下更改 HTTP 客户端的代理?

0 投票
4 回答
891 浏览

java - 如何禁用 openJdk 11 java.net.http.HttpClient 日志记录?

我正在使用来自 openJDK 11 的 httpclient,它带有烦人的循环日志记录。

这里的样子(我正在使用基于弹簧启动的应用程序):

我试图通过将以下条目添加到 logback-spring.xml 来禁用它,但无济于事:

谢谢你的帮助

0 投票
0 回答
160 浏览

java - Java 11 HttpClient 无法调用 React 开发服务器

Java 11 的新HttpClient版本不适用于create-react-app的 React 开发服务器(从 开始npm start)。客户端无限期挂起,没有任何错误。

它适用于其他 URLhttps://google.com和其他本地服务器,例如

  • Node.js 服务器。例如http-server(npm install http-server -g)
  • Python 服务器 ( python3 -m http.server 3000)

知道为什么 React 开发服务器会发生这种情况吗?

重现状态:

  • 通过创建一个反应应用程序npx create-react-app my-app(你只需要Node.jsnpx是它的一部分)
  • 然后运行它cd my-appnpm start. 开发服务器启动http://localhost:3000/
  • 然后打开 Java 控制台:jshell

当 React 开发服务器工作时,打开jShell并复制/粘贴以下代码:

之后它无限期地挂在那里。

当从 Java 应用程序尝试此操作以查看带-Djdk.internal.httpclient.debug=true参数的日志时,日志如下: