Отправка HTTP / 2-запроса через сокет в Java - PullRequest
0 голосов
/ 07 мая 2019

Мне нужно отправить запрос HTTP / 2 через сокет TCP из моих классов Java.У меня есть кусок кода, который работает для простого 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();

Спасибо!

1 Ответ

4 голосов
/ 07 мая 2019

Это не сработает.

HTTP / 2 - это двоичный протокол, а не текстовый протокол, поэтому для использования необработанного сокета необходимо сгенерировать правильные байты, которые формируют запрос HTTP / 2.

Это довольно сложно, так как требует, чтобы вы реализовали HPACK для сжатия заголовков, так что вам будет гораздо лучше использовать библиотеку Java, которая выполняет HTTP / 2 для вас, с API более высокого уровня ( вместо использования сырых сокетов).

[Отказ от ответственности: я являюсь разработчиком HTTP / 2 в Jetty] .

Jetty предлагает низкоуровневый клиент HTTP / 2, который позволяет работать с кадрами HTTP / 2, и высокоуровневый клиент HTTP, который может отправлять общий HTTP-запрос в формате HTTP / 2.

Для первого вы можете найти пример здесь: 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

...