У меня есть небольшой пример сервлета, развернутого на Tomcat, который будет возвращать любые полученные параметры. Tomcat настроен на поддержку HTTP/1.1 и HTTP/2. Я могу использовать curl
для выполнения запросов GET к сервлету, демонстрируя, что он работает как по HTTP/1.1, так и по HTTP/2.
Используя клиент Apache HTTP 5.0, у меня есть модульный тест для обращения к сервлету и POST
запрос с некоторыми параметрами (содержимое запроса), который работает нормально - сервер получает параметры и возвращает их клиенту, где я могу их прочитать. В этом тесте я призываю клиента использовать HTTP/1.1 или HTTP/2, используя вызов CloseableHttpAsyncClient.setVersionPolicy()
. Однако, если я перейду на использование HTTP/2, клиент не отправит содержимое запроса на сервер.
Ниже приведен пример кода для успешного вызова HTTP/1.1 — вы можете видеть, что у меня есть setVersionPolicy(HttpVersionPolicy.FORCE_HTTP_1)
. Если я изменю это на FORCE_HTTP_2
, тогда вызов будет выполнен через HTTP/2.0, но содержимое запроса не будет отправлено.
Может ли кто-нибудь предложить, что я делаю неправильно или что еще мне нужно сделать? Я не нашел много документации по использованию новых клиентских библиотек Apache 5.0, а в примерах не показана отправка и POST-контент (по крайней мере, те, что я могу найти).
public void testWithHTTP1() throws Exception {
final String content = "Code=99&Message=Hello";
final String contentType = "application/text";
final CloseableHttpAsyncClient client = HttpAsyncClients.custom()
.setVersionPolicy(HttpVersionPolicy.FORCE_HTTP_1)
.build();
client.start();
final HttpHost target = new HttpHost("http","localhost",8002);
final String requestUri = "/VSFTestMT_Test/Test/Test_EchoHttpGet";
final HttpClientContext clientContext = HttpClientContext.create();
final SimpleHttpRequest httppost = SimpleHttpRequests.post(target, requestUri);
httppost.setBody(content, ContentType.create("application.x_www_form_urlencoded"));
final Future<SimpleHttpResponse> future = client.execute(
httppost,
clientContext,
new FutureCallback<SimpleHttpResponse>() {
@Override
public void completed(final SimpleHttpResponse response) {
System.out.println(requestUri + "->" + response.getCode());
System.out.println(response.getBody());
}
@Override
public void failed(final Exception ex) {
System.out.println(requestUri + "->" + ex);
}
@Override
public void cancelled() {
System.out.println(requestUri + " cancelled");
}
});
System.out.println("Shutting down");
client.close(CloseMode.GRACEFUL);
}