使用流畅的API修复HttpClient警告"无效的expires属性"

The*_*onk 35 cookies apache-commons-httpclient

我正在使用HttpClient的流畅API来发出GET请求:

String jsonResult = Request.Get(requestUrl)
            .connectTimeout(2000)
            .socketTimeout(2000)
            .execute().returnContent().asString();
Run Code Online (Sandbox Code Playgroud)

但是对于每个请求,我收到以下警告:

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
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题并继续使用流畅的界面?理想情况下,我想要一个正确的方法来解决它,但因为我并不真正关心我的用例中的cookie,任何只允许我停止显示警告的解决方案(除了重定向stderr,因为我需要它)是受欢迎的.

rus*_*tyx 78

默认的HttpClient很难理解最新的RFC兼容标头.

而不是隐藏警告,只需切换到这样的标准cookie规范(HttpClient 4.4+):

    HttpClient httpClient = HttpClients.custom()
        .setDefaultRequestConfig(RequestConfig.custom()
            .setCookieSpec(CookieSpecs.STANDARD).build())
        .build();
Run Code Online (Sandbox Code Playgroud)

  • 是否有某个版本的 http 客户端不再需要此设置?对我来说,将 cookie 规范设置为“标准”似乎是一个明智的默认设置。 (4认同)
  • 你钉了它。我正在使用springboot resttemplate,它需要额外的步骤来设置HttpComponentsClientHttpRequestFactory对象的httpclient,然后将其传递给resttemplate (2认同)
  • 以下是 HttpClient 的 jira 中此行为的报告,开发人员提出了同样的建议:https://issues.apache.org/jira/browse/HTTPCLIENT-1763 (2认同)

Yas*_*r G 10

对于不想考虑对象模型的开发人员,可以如下使用为 RestTemplate 包装 HttpClient (如上面提到的@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)
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

并将其与 RestTemplate Builder 一起使用

var restTemplate = restTemplateBuilder.additionalCustomizers(
            new RestTemplateStandardCookieCustomizer()
        ).build();
Run Code Online (Sandbox Code Playgroud)


hna*_*eri 9

如果要使用HttpClientBuilder,可以使用以下语法:

        HttpClient httpClient = HttpClientBuilder.create()
            .setDefaultRequestConfig(RequestConfig.custom()
                    .setCookieSpec(CookieSpecs.STANDARD).build()).build();
Run Code Online (Sandbox Code Playgroud)