Всегда ли keep-alive отправляется в запросах с использованием httpclient и как предотвратить его отправку - PullRequest
0 голосов
/ 18 мая 2019

У меня есть проект Java / Spring, где я использую Oauth2RestTemplate и заставляю его использовать HttpClient (org.apache.http.client.Httpclient) вместо стандартного SimpleClient

HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build(); 

HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
oAuth2RestTemplate.setRequestFactory(requestFactory);

.Я хотел знать / понять, всегда ли заголовок keep-alive отправляется для всех запросов?

Если он всегда отправляется, есть ли способ отключить его отправку?Я вижу сообщение - Disable Keep Alive в Apache HttpClient , в котором говорится о его отключении, но предлагается настройка httpMethod.Я не уверен, как получить доступ к этому httpMethod в моей настройке кода, описанной выше.

1 Ответ

0 голосов
/ 18 мая 2019

Реализуйте ConnectionReuseStrategy с помощью метода keepAlive(), который просто возвращает false.См. setConnectionReuseStrategy() в HttpClientBuilder.

. Вы также можете отправить заголовок Connection со значением close.

https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/ConnectionReuseStrategy.html

Пример:

List<Header> headers = new ArrayList<>();
headers.add(new BasicHeader(HttpHeaders.CONNECTION, "close"));
HttpClientBuilder builder = HttpClients.custom().setDefaultHeaders(headers)
  .setConnectionReuseStrategy(
    new ConnectionReuseStrategy() {
      @Override
      public boolean keepAlive(HttpResponse httpResponse, HttpContext httpContext) {
        log.info("**** keepAlive strategy returning false");
        return false;
      }
});
CloseableHttpClient httpClient = builder.build();
HttpGet httpGet = new HttpGet("https://google.com");
CloseableHttpResponse response = httpClient.execute(httpGet);
log.info("Response status: " + response.getStatusLine());
response.close();

Некоторая дополнительная информация:

1.Заголовок Keep-Alive

Когда большинство людей произносят заголовок keep-alive, они обычно имеют в виду другой заголовок, называемый Connection.Два заголовка работают вместе:

HTTP/1.1 200 OK
...
Connection: Keep-Alive
Keep-Alive: timeout=5, max=1000
...

Заголовок Connection является подсказкой о том, что соединение следует использовать повторно.Заголовок Keep-Alive указывает минимальное количество времени, в течение которого соединение должно оставаться открытым, и максимальное количество запросов, для которых соединение может быть повторно использовано.

Общие значения для заголовка Connection: keep-alive и close.И сервер, и клиент могут отправить этот заголовок.Если заголовок Connection установлен на close, заголовок Keep-Alive игнорируется.

2.HTTP / 1.1 и HTTP / 2

При использовании HTTP / 1.1 соединения являются постоянными по умолчанию.Заголовок Keep-Alive устарел (больше не определяется в спецификации HTTP), хотя многие серверы все еще отправляют их для обратной совместимости.

Клиенты, которые не могут обрабатывать постоянные соединения HTTP / 1.1, должны установить заголовок Connection со значением close.

HTTP / 2 использует мультиплексирование;Ни заголовок Connection, ни заголовок Keep-Alive не должны использоваться с HTTP / 2.

3.Эффект прокси и кешей

Вообще говоря, постоянные соединения не работают через непрозрачные прокси.Они будут молча отбрасывать любые заголовки Connection или Keep-Alive.

4.Обработка соединений

Поскольку постоянные соединения теперь используются по умолчанию в HTTP / 1.1, нам нужен механизм для контроля того, когда и как они используются.С HTTP-клиентом Apache ConnectionReuseStrategy определяет, должно ли соединение быть постоянным, а ConnectionKeepAliveStrategy указывает максимальное время простоя для повторного использования соединения.

...