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

java - Java 11:新的 HTTP 客户端使用 x-www-form-urlencoded 参数发送 POST 请求

我正在尝试使用新的 http 客户端 api 发送 POST 请求。是否有内置的方式来发送格式为的参数x-www-form-urlencoded

我当前的代码:

我正在寻找一种更好的方法来传递参数。像这样的东西:

我需要自己构建这个功能还是已经内置了?

我正在使用 Java 12。

0 投票
0 回答
2862 浏览

java - 检索 Java 11 HTTP 客户端 Cookie

这是一些有效的 bash 代码:

这是我对在 JVM 11 上运行的 Scala 2.13 的类似代码的尝试(非 Scala 程序员应该通过稍微眯眼就能轻松阅读此代码)。

maybeLoginCookie从其他地方调用。

即使我看到身份验证有效,我也没有得到 cookie。问题可能与我如何初始化 HTTP 客户端的 cookie 处理有关吗?

0 投票
1 回答
1138 浏览

java - 模拟 HttpClient 的 execte() 方法

我想模拟返回虚拟响应的execute方法HttpClass,但我的测试代码正在执行请求。

班级代码 -

测试类代码 -

我尝试了 Mockito 而不是 PowerMockito,但仍然请求实际执行。

0 投票
1 回答
2122 浏览

java - 使用 java 11 HttpClient 将响应主体流式传输到流式请求主体

我正在尝试将来自 HTTP (GET) 响应的数据流式传输到另一个 HTTP (POST) 请求。使用旧的 HttpURLConnection,我将获取响应 OutputStream,将部分读入缓冲区并将它们写入请求 InputStream。

我已经设法在 Java 11 中对 HttpClient 做同样的事情,方法是创建我自己的 Publisher,在 POST 中使用它来编写请求正文。GET 请求有一个BodyHandlerwithofByteArrayConsumer将块发送到自定义发布者,然后它自己将块发送到订阅 HTTP POST 请求。

但我认为这不是正确的方法,因为看起来 API 中有一些东西看起来可以直接完成,而无需自己实现发布者和订阅者。

HttpResponse.BodyHandlers.ofPublisher()一个返回一个Publisher<List<ByteBuffer>我可以用于 HTTP GET 请求的。不幸的是,对于我的 POST 请求,HttpRequest.BodyPublishers.fromPublisher它需要一个Publisher<? extends ByteBuffer>,所以似乎 fromPublisher 仅适用于拥有完整 ByteBuffer 的发布者,而不适用于为部分数据发送多个 ByteBuffer 的发布者。

我是否错过了一些能够将 BodyPublisher 从一个请求连接到另一个请求的东西?

0 投票
3 回答
11720 浏览

java - 如何使用 Java 11 HttpClient 和 Jackson 将 JSON 响应映射到 Java 类?

我是 Java 11 HttpClient 的新手,想试一试。我有一个返回 JSON 的简单 GET 请求,我想将 JSON 响应映射到名为Questionnaire.

我知道我可以将开箱即用的响应变成这样的字符串或输入流

如何编写将 JSON 字符串转换为我的 Questionnaire 类的东西?

我使用 Jackson 将 JSON 转换为 Java 类实例。Jackson 是否支持新的 Java 标准 HttpClient?

更新 1 我不够精确,对此感到抱歉。我正在寻找一个阻塞获取示例。我知道http://openjdk.java.net/groups/net/httpclient/recipes.html#jsonGet

0 投票
3 回答
12766 浏览

java - 使用 Java 11 HttpClient 和带有 Jackson 的自定义 BodyHandler 反序列化 JSON 停止并且不会继续

我在使用HttpClient::send带有 custom的 Java 11 直接将 JSON 反序列化为自定义对象时遇到问题HttpResponse.BodyHandler。我在回答这个 SO question时遇到了这个问题。

我正在使用的版本:

  • 开放JDK 11
  • 杰克逊 2.9.9.3

我创建了一个简单的泛型JsonBodyHandler类,它实现HttpResponse.BodyHandler

asJSON方法定义为:

所以它返回一个自定义HttpResponse.BodySubscriber,它获取正文String,然后应用从 JSON 到给定的映射targetType 来测试它的代码:

Model班级:

输出如预期:

但是,当我将asJSON方法更改为 readInputStream而不是Stringfirst 时:

它在调用读取值后挂起ObjectMapper并且它没有继续(我已经检查它是否成功地从端点获得响应,状态代码是 200)但是它只是挂起。有谁知道可能是什么问题?

0 投票
1 回答
1552 浏览

java - 如何使用 HTTP/2 over TLS 发送 HTTP 请求?(Java 11 HttpClient)

我正在尝试在 Java 应用程序中创建一个代理,它允许我修改 HTTP 请求的某些方面。

为此,我在端口 8080 上打开一个 ServerSocket,在 Mozilla Firefox 中在该端口上配置一个代理,并且对于每个连接,在单独的线程中执行 ServerSocket 的 accept() 方法。到目前为止一切正常。

为了将请求从浏览器发送到相应的网站,我使用了 Java 11 中包含的 HttpClient 库。这是我使用该库的一段代码:

注意:IHttpRequest 是我创建的一个类,其中包含从套接字收集的所有信息(目标主机、标头、正文(如果存在)等)

到目前为止,我已经成功拦截了所有指向 HTTP 网站的请求。但是,我遇到了问题,例如https://www.google.com/,它实现了 HTTP / 2 协议并使用 TLS。当我运行 Java 应用程序并访问上一个 Google 页面时,它没有向我显示网站,而是在浏览器中显示以下内容(忽略标题之间的空白):

HTTP/2 200 正常

:状态:200

alt-svc: quic = ":443"; 马 = 2592000; v = "46,43,39"

缓存控制:私有

内容编码:gzip

内容长度:46058

内容类型:文本/html;字符集 = UTF-8

日期:2019 年 9 月 3 日星期二 09:47:34 GMT

到期:星期二,2019 年 9 月 3 日 09:47:34 GMT

p3p: CP = “这不是 P3P 政策!有关更多信息,请参见 g.co/p3phelp。”

服务器:gws

设置cookie:1P_JAR = 2019-09-03-09;过期 = 格林威治标准时间 2019 年 10 月 3 日星期四 09:47:34;路径 = /; 域 = .google.com;SameSite = none NID = 188 = XOJkffugf5G8rxNLov_iqqxo-Cq5RCvhwJPNu9tvtzLesZ4q8CE0IDVt9VgCEHZsw-AV0EYaaL8D4d_2Qwb6jXCcss7RydfV9PqQFemN_Ezz0kUjyseDDbJXfrHpmqPR6GIQCnR7bjukfasxg883K9fjnhAaqz6IpUYxoguZx-vazWc; 过期 = 格林威治标准时间 2020 年 3 月 4 日星期三 09:47:34;路径 = /; 域 = .google.com;HttpOnly 同意 = WP.27dd1a; 过期 = 格林威治标准时间 2038 年 1 月 1 日星期五 00:00:00;路径 = /; 域 = .google.com

x 框架选项:SAMEORIGIN

x-xss-保护:0

(↓↓身体↓↓)

‹������ ÿÔ½ézâȲ (ú¿Ÿ‚ ¢ örÁ²À 或 PªÚ ° çyÜÞ¾ © $ Æ.ÞåžG¸ßýwþ® »™ š ¶« »× ùöíê ¢ ¤T '' '' ™ 'ß¿ († l / Æj ¢ 或 õ ßñ7¡ “QOLªV ÞU ¢ üø> Tm' ûÄ´T [L ^] îd * I7Õ Ùê Rçšb ÷ EE i²š¡ / ÜP ié0cÉDWE!ËsCò I ™ ZªI_ ‰) ## ™ '* & gš: ¦½ÒŽê¸ oŒ ‚™» † 9 $ vFQmU¶5c´Rˆ (Š © ZÖï 1L§ Üì ¦ÚUMS5W² Û $ # K'¶êæí FOWWrniCÒS-ò + Ú¨ · Åòõ¶ „÷ ñɲá 1 • 'ÙÐ

<< 还有更多字节形式的信息>>

你在我的代码中看到什么奇怪的东西吗?我知道 HTTP / 2 压缩帧中的标头,但我认为 HTTPClient 是在内部完成的......

如果您需要更多信息,请告诉我:)

先感谢您。

0 投票
2 回答
1004 浏览

java - 如何使用 HTTP 选项方法和 HTTPClient (Java 11) 发送请求?

正如标题所说,我想知道如何使用 HTTPClient 和 Java 中的 OPTIONS 方法发送 HTTP 请求。我查看了可以使用的 HTTP 方法(GET、POST、PUT 和 DELETE),但我没有看到这个选项。使用 HTTPClient 的 GET/POST 请求示例如下:

如果它不能使用(这对我来说似乎非常罕见),我可以使用什么替代方案?

非常感谢您!

0 投票
0 回答
1913 浏览

java - java.net.HttpClient 在进行 POST 时因 EOFException 而失败

我有一个应用程序使用 openjdk-11.0.1 java.net.HttpClient 向 REST(ish) 端点发出多部分 POST 请求。该端点在执行任何工作时都会阻止响应,当工作完成时,它会返回响应。这个端点的性质是响应可以在 1s 到 1d 之间进行,所以这个连接可以保持长时间。

所以无论如何,最近我开始遇到以下错误,即使目标服务器上的进程似乎仍然执行得很好。有没有人对此错误的可能原因有任何想法?

这是我的 HttpClient 的创建:


更新:

我没有找到答案。升级到最新的 java 版本会有所帮助(java httpclient 的 8 对 14 改变了很多)。

此外,此响应通常由下游服务器生成,而不是客户端。这意味着我连接的服务器关闭了连接。我们认为这是因为在传输大量数据时连接被检测为“空闲”。

对于较旧的 java httpclients,关闭 keepalive 似乎也有助于解决这个问题。在实例化您的 httpclient 之前,请进行以下调用:

在每个请求上,我都会关闭连接:

引用的 HttpHeaders 类:

0 投票
0 回答
51 浏览

java - 使用 Java HttpClient 的持久连接(保持活动状态)

我们正在使用 Java 11 中添加的新(相对而言)Java HttpClient构建一个应用程序。我们使用的是 Java 12。总体而言,API 很好,但我找不到任何与持久连接相关的东西。大多数其他类似的 API 以某种方式支持连接池和持久连接,但据我所知,文档中没有提到它。

我们真的希望保持连接处于活动状态以减少 TLS 握手的延迟,并且对它的完成方式进行一些控制会很好。

这在某处得到支持和记录吗?或者客户端是否在掩护下自动使用持久连接,但没有任何 API 来控制它是如何完成的?还是根本不支持?