【问题标题】:Sending HTTP/2 request via Socket in Java在 Java 中通过 Socket 发送 HTTP/2 请求
【发布时间】:2019-09-24 23:04:20
【问题描述】:


我需要通过我的 Java 类的 TCP 套接字发送 HTTP/2 请求。我已经适配了一段适用于普通 HTTP/1.1 的代码。但是,在使用 HTTP/2 时,它不会输出任何响应或错误代码。

你能看出其中有什么不对吗?我尝试访问的服务器位于https://localhost:8443

Socket s = new Socket(InetAddress.getByName("localhost"), 8443);
PrintWriter pw = new PrintWriter(s.getOutputStream());
pw.print("GET / HTTP/2.0\r\n");
pw.print("Host: localhost:8443\r\n\r\n");
pw.flush();
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String t;
while((t = br.readLine()) != null) System.out.println(t);
br.close();

谢谢!

【问题讨论】:

  • 这真的是一个有效的 HTTP/2 请求吗?
  • 我已经从 Firefox 调试器中组装了它。我认为是,但我在问题中包含了 http/2 组以确认它

标签: java http2


【解决方案1】:

那行不通。

HTTP/2 是二进制协议,而不是文本协议,因此为了使用原始套接字,您必须生成形成 HTTP/2 请求的正确字节。

这相当复杂,因为它要求您实现 HPACK 来压缩标头,因此您最好使用为您执行 HTTP/2 的 Java 库,以及更高级别的 API(而不是使用原始插座)。

[免责声明:我是Jetty] 中的 HTTP/2 实施者。

Jetty 提供了一个低级 HTTP/2 客户端,允许您处理 HTTP/2 帧,以及一个高级 HTTP 客户端,可以使用 HTTP/2 格式发送通用 HTTP 请求。

首先你可以在这里找到一个例子:https://github.com/eclipse/jetty.project/blob/jetty-9.4.18.v20190429/jetty-alpn/jetty-alpn-java-client/src/test/java/org/eclipse/jetty/alpn/java/client/JDK9HTTP2ClientTest.java

第二个是文档的这一部分:https://www.eclipse.org/jetty/documentation/9.4.x/http-client-transport.html#_http_2_transport

【讨论】:

  • 谢谢,我试试看!
猜你喜欢
  • 2020-01-06
  • 2013-01-15
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多