java 10 个 httpclient 孵化器 GET 请求在 node.js 服务器上失败
java 10 httpclient incubator GET request fails on node.js server
我一直在 Java 9/10 孵化器中试验 HttpClient 的东西,并且有以下琐碎的代码(实际上是从项目主页上偷来的!):
URI uri = URI.create("http://192.168.1.102:8080/");
HttpRequest getRequest = HttpRequest.newBuilder()
.uri(uri)
.GET()
.build();
HttpResponse<String> response = client.send(getRequest,
HttpResponse.BodyHandler.asString());
System.out.println("response to get: " + response.body());
我发现如果它指向不是本地主机的 URL 它工作正常,但如果我请求本地主机(无论是通过名称 "localhost",通过 172.0.0.1,或者通过本地主机的实际 IP 地址)。错误很奇怪,整个堆栈跟踪都没有提到我的任何代码。
WARNING: Using incubator modules: jdk.incubator.httpclient
Exception in thread "main" java.io.EOFException: EOF reached while reading
at jdk.incubator.httpclient/jdk.incubator.http.Http1AsyncReceiver$Http1TubeSubscriber.onComplete(Http1AsyncReceiver.java:507)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$ReadSubscription.signalCompletion(SocketTube.java:551)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$InternalReadSubscription.read(SocketTube.java:728)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$SocketFlowTask.run(SocketTube.java:171)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:198)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:271)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:224)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$InternalReadSubscription.signalReadable(SocketTube.java:675)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$ReadEvent.signalEvent(SocketTube.java:829)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$SocketFlowEvent.handle(SocketTube.java:243)
at jdk.incubator.httpclient/jdk.incubator.http.HttpClientImpl$SelectorManager.handleEvent(HttpClientImpl.java:769)
at jdk.incubator.httpclient/jdk.incubator.http.HttpClientImpl$SelectorManager.run(HttpClientImpl.java:731)
本地有一个服务器 运行,我可以使用网络浏览器的简单请求连接到它。
有什么想法吗?
[编辑]我相信,我找到了这个项目的邮件列表。它是 "obfuscated"(完全把我骗了!)但显示为:net dash dev at openjdk dot java dot net
我也会 post 那里,看看他们是否有任何意见。
[编辑 2]我很确定这与 localhost(根据原始标题)无关,而是与节点进行协议协商的内容。js/express(这是我的服务器使用,因为它很容易试验)。节点偶尔(例如,最后一行文本不是 LF 终止)似乎报告错误 content-length,但这不是问题,因为错误仍然发生在正确的长度上。我认为这可能是尝试将连接升级到 HTTP/2.0 时的错误,但还不知道...
[编辑 3]在浪费了我太多的生命实验之后,我相当确定 node.js 8.11.1(并表达 4.13.4 和 body-parser 1.15.1) 处理导致问题的将 a 升级到 HTTP 2.0 的请求。但我不知道是什么。我放弃了,将使用不同的服务器继续学习 httpClient 的过程。
已更新。我终于得到了支持 http 2.0 的 curl,这完全归咎于 node/express。当此服务器看到升级请求(节点 8.something)时,它根本无法创建任何 output.Consequently,客户端正确地失败并出现 EOF 错误。
作为旁注,node/express 有时也会设置 content-length header "off by one"(不总是!?)
试试这个
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("http://localhost:3000"))
.POST(BodyPublisher.fromString("hello"))
.version(Version.HTTP_1_1).build();
我一直在 Java 9/10 孵化器中试验 HttpClient 的东西,并且有以下琐碎的代码(实际上是从项目主页上偷来的!):
URI uri = URI.create("http://192.168.1.102:8080/");
HttpRequest getRequest = HttpRequest.newBuilder()
.uri(uri)
.GET()
.build();
HttpResponse<String> response = client.send(getRequest,
HttpResponse.BodyHandler.asString());
System.out.println("response to get: " + response.body());
我发现如果它指向不是本地主机的 URL 它工作正常,但如果我请求本地主机(无论是通过名称 "localhost",通过 172.0.0.1,或者通过本地主机的实际 IP 地址)。错误很奇怪,整个堆栈跟踪都没有提到我的任何代码。
WARNING: Using incubator modules: jdk.incubator.httpclient
Exception in thread "main" java.io.EOFException: EOF reached while reading
at jdk.incubator.httpclient/jdk.incubator.http.Http1AsyncReceiver$Http1TubeSubscriber.onComplete(Http1AsyncReceiver.java:507)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$ReadSubscription.signalCompletion(SocketTube.java:551)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$InternalReadSubscription.read(SocketTube.java:728)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$SocketFlowTask.run(SocketTube.java:171)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:198)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:271)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:224)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$InternalReadSubscription.signalReadable(SocketTube.java:675)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$ReadEvent.signalEvent(SocketTube.java:829)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$SocketFlowEvent.handle(SocketTube.java:243)
at jdk.incubator.httpclient/jdk.incubator.http.HttpClientImpl$SelectorManager.handleEvent(HttpClientImpl.java:769)
at jdk.incubator.httpclient/jdk.incubator.http.HttpClientImpl$SelectorManager.run(HttpClientImpl.java:731)
本地有一个服务器 运行,我可以使用网络浏览器的简单请求连接到它。
有什么想法吗?
[编辑]我相信,我找到了这个项目的邮件列表。它是 "obfuscated"(完全把我骗了!)但显示为:net dash dev at openjdk dot java dot net
我也会 post 那里,看看他们是否有任何意见。
[编辑 2]我很确定这与 localhost(根据原始标题)无关,而是与节点进行协议协商的内容。js/express(这是我的服务器使用,因为它很容易试验)。节点偶尔(例如,最后一行文本不是 LF 终止)似乎报告错误 content-length,但这不是问题,因为错误仍然发生在正确的长度上。我认为这可能是尝试将连接升级到 HTTP/2.0 时的错误,但还不知道...
[编辑 3]在浪费了我太多的生命实验之后,我相当确定 node.js 8.11.1(并表达 4.13.4 和 body-parser 1.15.1) 处理导致问题的将 a 升级到 HTTP 2.0 的请求。但我不知道是什么。我放弃了,将使用不同的服务器继续学习 httpClient 的过程。
已更新。我终于得到了支持 http 2.0 的 curl,这完全归咎于 node/express。当此服务器看到升级请求(节点 8.something)时,它根本无法创建任何 output.Consequently,客户端正确地失败并出现 EOF 错误。
作为旁注,node/express 有时也会设置 content-length header "off by one"(不总是!?)
试试这个
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("http://localhost:3000"))
.POST(BodyPublisher.fromString("hello"))
.version(Version.HTTP_1_1).build();