问题标签 [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.
java - 在 URL 查询参数中使用某些字符时出现 Java 9 HttpClient 异常
这是我的示例代码。查询编码为 UTF-8:
运行此示例后,我得到以下异常:
char=324
ń
表示从查询中解码
当我阅读堆栈跟踪时,我jdk.incubator.http.Stream<T>
在类中找到了这个方法:
在这个方法uri.getQuery()
中使用它给我们解码的查询并导致上述异常。
当我uri.getRawQuery()
在调试模式下使用时(它给了我们编码的查询)一切都很好。
我的问题是:这是错误还是故意使用?如果它不是错误,我该如何避免异常?
java - 如何在 Java http 客户端中自定义“主机”标头
这是我的代码:
结果,我看到上面的代码发送:
如您所见,它发送了两个Host
标头(一个来自 URI 和一个我指定的标头),但我希望它发送Host
我指定的标头,而不是来自 URI 的标头。这个客户端可以吗?
编辑:在 Java 11 中,情况变得更糟(您需要将 client.send 行更改为:)client.send(request, HttpResponse.BodyHandlers.ofString());
:
如何自定义该标头(测试虚拟主机所需)?
我也尝试过setHeader
并得到完全相同的问题(双Host
标头或异常)。
编辑:我报告了一个JDK 错误。
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
这是发出非阻塞/异步请求的示例:
java - 使用 Java 11 HttpClient 读取分块数据
我正在尝试使用 Java 11 的 java.net.http.HttpClient 从 Http 响应中读取分块数据,但我一次只能得到一行。我需要一次得到一整块。
这是我的代码:
但我得到的响应是单独的行:
我意识到这是因为我正在使用 BufferedReader 并告诉它在我得到它时记录每一行,但我不知道如何将这些行读取为块。
有人可以帮我弄清楚如何以原子方式读取块,以便我可以将它们解析为 JSON,一次一个事件吗?
解决方案
必须使用 JsonProcessor 来解析 Json 到达时的流:
java - JDK 11 HttpClient 引发“无主题替代 DNS 名称”错误
我正在编写一个基于 JDK11 HttpClient 的简单 REST api 客户端,简单代码如下:
问题是当我尝试打开一些 SSL 域时出现错误:
原因:java.security.cert.CertificateException:找不到与 somehostname.xx.xxx.net 匹配的主题备用 DNS 名称。
我怎么解决这个问题?
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。
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 中的严重设计缺陷。
java - 如何使用 java.net.http.HttpClient 记录请求/响应?
Java 9 中实验性引入的HttpClient现在在 Java 11 中稳定了,但毫不奇怪,似乎很少有项目真正使用它。文档几乎不存在。
进行 HTTP 调用时最常见的问题之一是记录请求/响应。当然,您将如何使用 来做到这一点HttpClient
,而不是在每次调用中手动记录它?是否有类似所有其他 HTTP 客户端提供的拦截器机制?
java-11 - 使新的 JDK 11 java.net.http 包在 Netbeans 10 中可见
在 Apache Netbeans 10 中打开现有的 Netbeans 8 项目并将 Java 版本设置为最新的 JDK 11 后,Netbeans 仍然无法解析对新java.net.http
包的引用,其中包括改进的 HTTP 处理,如HttpClient
、HttpRequest
和HttpResponse
.
需要做什么才能使新java.net.http
包对 Apache Netbeans 10 中的现有项目可见?
java - 使用 JDK 11 HttpClient 进行代理身份验证
我正在尝试使用 JDK 11 HttpClient通过公司代理发出请求,该代理需要通过登录名和密码进行身份验证。根据JDK的介绍,我正在通过以下方式构建客户端实例:
,其中authenticator
是:
然后我自己执行请求:
但我收到的不是来自目标服务器 ( https://httpwg.org ) 的有效响应,而是HTTP 407 (Proxy Authentication Required),即HttpClient
不使用提供的authenticator
。
使它工作的正确方法是什么?