Исправление предупреждения HttpClient "Недопустимый атрибут истечения" с использованием свободного API
Я использую свободный API HttpClient для запроса GET:
String jsonResult = Request.Get(requestUrl)
.connectTimeout(2000)
.socketTimeout(2000)
.execute().returnContent().asString();
Но для каждого запроса я получаю следующее предупреждение:
apr 07, 2016 12:26:46 PM org.apache.http.client.protocol.ResponseProcessCookies processCookies
WARNING: Invalid cookie header: "Set-Cookie: WMF-Last-Access=07-Apr-2016;Path=/;HttpOnly;Expires=Mon, 09 May 2016 00:00:00 GMT". Invalid 'expires' attribute: Mon, 09 May 2016 00:00:00 GMT
Как я могу исправить это и продолжать использовать свободный интерфейс? В идеале я бы хотел найти правильный способ его исправить, но так как я не очень-то забочусь о том, что файлы cookie в моем случае используют любое решение, которое позволяет мне прекратить отображение предупреждений (помимо перенаправления stderr, потому что мне это нужно) приветствуется,
Ответы
Ответ 1
По умолчанию HttpClient испытывает трудности с пониманием последних RFC-совместимых заголовков.
Вместо того, чтобы скрывать предупреждение, просто переключитесь на стандартную спецификацию cookie, подобную этой (HttpClient 4. 4+):
HttpClient httpClient = HttpClients.custom()
.setDefaultRequestConfig(RequestConfig.custom()
.setCookieSpec(CookieSpecs.STANDARD).build())
.build();
Ответ 2
Если вы хотите использовать HttpClientBuilder
вы можете использовать следующий ситакс:
HttpClient httpClient = HttpClientBuilder.create()
.setDefaultRequestConfig(RequestConfig.custom()
.setCookieSpec(CookieSpecs.STANDARD).build()).build();
Ответ 3
Для разработчиков, которые не хотят думать об объектной модели, можно использовать обертку HttpClient для RestTemplate, как показано ниже (как упомянуто выше @comiventor, особенно для разработчиков Spring Boot).
настройщик для RestTemplate,
public class RestTemplateStandardCookieCustomizer
implements RestTemplateCustomizer {
@Override
public void customize(final RestTemplate restTemplate) {
final HttpClient httpClient = HttpClients.custom()
.setDefaultRequestConfig(RequestConfig.custom()
.setCookieSpec(CookieSpecs.STANDARD).build())
.build();
restTemplate.setRequestFactory(
new HttpComponentsClientHttpRequestFactory(httpClient)
);
}
}
и использование его с помощью RestTemplate Builder
var restTemplate = restTemplateBuilder.additionalCustomizers(
new RestTemplateStandardCookieCustomizer()
).build();
Ответ 4
Решено:
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http.client.protocol.ResponseProcessCookies", "fatal");