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

java - 在 URL 查询参数中使用某些字符时出现 Java 9 HttpClient 异常

这是我的示例代码。查询编码为 UTF-8:

运行此示例后,我得到以下异常:

char=324ń表示从查询中解码

当我阅读堆栈跟踪时,我jdk.incubator.http.Stream<T>在类中找到了这个方法:

在这个方法uri.getQuery()中使用它给我们解码的查询并导致上述异常。

当我uri.getRawQuery()在调试模式下使用时(它给了我们编码的查询)一切都很好。

我的问题是:这是错误还是故意使用?如果它不是错误,我该如何避免异常?

0 投票
2 回答
9235 浏览

java - 如何在 Java http 客户端中自定义“主机”标头

这是我的代码:

结果,我看到上面的代码发送:

如您所见,它发送了两个Host标头(一个来自 URI 和一个我指定的标头),但我希望它发送Host我指定的标头,而不是来自 URI 的标头。这个客户端可以吗?

编辑:在 Java 11 中,情况变得更糟(您需要将 client.send 行更改为:)client.send(request, HttpResponse.BodyHandlers.ofString());

如何自定义该标头(测试虚拟主机所需)?

我也尝试过setHeader并得到完全相同的问题(双Host标头或异常)。

编辑:我报告了一个JDK 错误

0 投票
4 回答
3733 浏览

java - 当块到达时,如何使用 java.net.http 读取和打印分块的 HTTP 响应?

Java 11 引入了一个新包java.net.http,用于发出 HTTP 请求。对于一般用途,它非常简单。

java.net.http我的问题是:当客户端收到每个块时,我如何使用它来处理块响应?

java.http.net包含一个BodySubscriber似乎是我想要的反应式,但我找不到如何使用它的示例。

http_get_demo.py

下面是一个 python 实现,当它们到达时打印块,我想用 java.net.http 做同样的事情:

HttpGetDemo.java

为了完整起见,这里有一个使用 java.net.http 发出阻塞请求的简单示例:

HttpAsyncGetDemo.java

这是发出非阻塞/异步请求的示例:

0 投票
2 回答
4305 浏览

java - 使用 Java 11 HttpClient 读取分块数据

我正在尝试使用 Java 11 的 java.net.http.HttpClient 从 Http 响应中读取分块数据,但我一次只能得到一行。我需要一次得到一整块。

这是我的代码:

但我得到的响应是单独的行:

我意识到这是因为我正在使用 BufferedReader 并告诉它在我得到它时记录每一行,但我不知道如何将这些行读取为块。

有人可以帮我弄清楚如何以原子方式读取块,以便我可以将它们解析为 JSON,一次一个事件吗?


解决方案

必须使用 JsonProcessor 来解析 Json 到达时的流:

0 投票
1 回答
3031 浏览

java - JDK 11 HttpClient 引发“无主题替代 DNS 名称”错误

我正在编写一个基于 JDK11 HttpClient 的简单 REST api 客户端,简单代码如下:

问题是当我尝试打开一些 SSL 域时出现错误:

原因:java.security.cert.CertificateException:找不到与 somehostname.xx.xxx.net 匹配的主题备用 DNS 名称。

我怎么解决这个问题?

0 投票
1 回答
2294 浏览

java - 在 Java 11 中使用 HttpBuilder API,在哪里指定 hostNameVerifier?

我们正在将服务从 JDK 10.0.1 迁移到 JDK 11。该服务使用 TLS 连接进行通信,其中服务器具有自签名证书。

此证书的 CA 已添加到两个 JVM 的 cacerts 中。

使用 JDK 10,这足以使用 HttpBuilder API 并与该服务进行通信。当运行相同的代码(仅从 jdk.incubator.http 到 java.net.http 的更改)到 JDK 11 时,我遇到了臭名昭著的“java.security.cert.CertificateException:没有主题替代名称存在”错误?

我知道这很容易通过创建具有自定义实现的 HostNameVerifier 来解决,然后与 HttpsUrlConnection 一起使用。

但如果可能的话,我宁愿坚持使用 HttpBuilder API。

0 投票
3 回答
21656 浏览

java - 允许 Java JDK 11 HttpClient 的不安全 HTTPS 连接

有时需要允许不安全的 HTTPS 连接,例如在一些应与任何站点一起工作的网络爬取应用程序中。我在旧的 HttpsURLConnection API 中使用了一个这样的解决方案,该 API 最近被 JDK 11 中的新 HttpClient API取代。使用这个新 API允许不安全的 HTTPS 连接(自签名或过期证书)的方法是什么?

UPD:我尝试过的代码(在 Kotlin 中,但直接映射到 Java):

但是在发送时我有异常(尝试使用自签名证书在本地主机上):

使用 IP 地址而不是 localhost 会出现“不存在主题替代名称”异常。

在对 JDK 进行了一些调试之后,我发现sslParams在抛出异常的地方确实被忽略了,并且使用了一些本地创建的实例。进一步调试显示,影响主机名验证算法的唯一方法是将jdk.internal.httpclient.disableHostnameVerification系统属性设置为 true。这似乎是一个解决方案。SSLParameters在上面的代码中没有任何效果,所以这部分可以被丢弃。使其仅在全局范围内可配置看起来像是新 HttpClient API 中的严重设计缺陷。

0 投票
3 回答
18831 浏览

java - 如何使用 java.net.http.HttpClient 记录请求/响应?

Java 9 中实验性引入的HttpClient现在在 Java 11 中稳定了,但毫不奇怪,似乎很少有项目真正使用它。文档几乎不存在。

进行 HTTP 调用时最常见的问题之一是记录请求/响应。当然,您将如何使用 来做到这一点HttpClient,而不是在每次调用中手动记录它?是否有类似所有其他 HTTP 客户端提供的拦截器机制?

0 投票
1 回答
2965 浏览

java-11 - 使新的 JDK 11 java.net.http 包在 Netbeans 10 中可见

在 Apache Netbeans 10 中打开现有的 Netbeans 8 项目并将 Java 版本设置为最新的 JDK 11 后,Netbeans 仍然无法解析对新java.net.http包的引用,其中包括改进的 HTTP 处理,如HttpClientHttpRequestHttpResponse.

需要做什么才能使新java.net.http包对 Apache Netbeans 10 中的现有项目可见?

0 投票
2 回答
5362 浏览

java - 使用 JDK 11 HttpClient 进行代理身份验证

我正在尝试使用 JDK 11 HttpClient通过公司代理发出请求,该代理需要通过登录名和密码进行身份验证。根据JDK的介绍,我正在通过以下方式构建客户端实例:

,其中authenticator是:

然后我自己执行请求:

但我收到的不是来自目标服务器 ( https://httpwg.org ) 的有效响应,而是HTTP 407 (Proxy Authentication Required),即HttpClient不使用提供的authenticator

我尝试了这里这里提到的各种解决方案,但没有一个有帮助。

使它工作的正确方法是什么?