使用 fluent API 修复 HttpClient 警告 "Invalid expires attribute"
Fixing HttpClient warning "Invalid expires attribute" using fluent API
我正在使用 HttpClient 的流畅 API 来发出 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,因为我需要它) .
解决方法:
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http.client.protocol.ResponseProcessCookies", "fatal");
默认的HttpClient难以理解最新的RFC-compliantheaders.
不要隐藏警告,只需切换到这样的标准 cookie 规范 (HttpClient 4.4+):
HttpClient httpClient = HttpClients.custom()
.setDefaultRequestConfig(RequestConfig.custom()
.setCookieSpec(CookieSpecs.STANDARD).build())
.build();
如果你想使用HttpClientBuilder
,你可以使用以下语法:
HttpClient httpClient = HttpClientBuilder.create()
.setDefaultRequestConfig(RequestConfig.custom()
.setCookieSpec(CookieSpecs.STANDARD).build()).build();
对于不想考虑对象模型的开发人员,可以如下使用 RestTemplate 的 HttpClient 包装(正如上面提到的@comiventor,特别是对于 Spring 引导开发人员)。
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();
我正在使用 HttpClient 的流畅 API 来发出 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,因为我需要它) .
解决方法:
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http.client.protocol.ResponseProcessCookies", "fatal");
默认的HttpClient难以理解最新的RFC-compliantheaders.
不要隐藏警告,只需切换到这样的标准 cookie 规范 (HttpClient 4.4+):
HttpClient httpClient = HttpClients.custom()
.setDefaultRequestConfig(RequestConfig.custom()
.setCookieSpec(CookieSpecs.STANDARD).build())
.build();
如果你想使用HttpClientBuilder
,你可以使用以下语法:
HttpClient httpClient = HttpClientBuilder.create()
.setDefaultRequestConfig(RequestConfig.custom()
.setCookieSpec(CookieSpecs.STANDARD).build()).build();
对于不想考虑对象模型的开发人员,可以如下使用 RestTemplate 的 HttpClient 包装(正如上面提到的@comiventor,特别是对于 Spring 引导开发人员)。
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();