【问题标题】:Fixing HttpClient warning "Invalid expires attribute" using fluent API使用流利的 API 修复 HttpClient 警告“无效的过期属性”
【发布时间】:2016-07-28 04:12:26
【问题描述】:

我正在使用 HttpClient 的 fluent 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,因为我需要它) .

【问题讨论】:

    标签: cookies apache-commons-httpclient


    【解决方案1】:

    默认的 HttpClient 难以理解最新的符合 RFC 的标头。

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

    HttpClient httpClient = HttpClients.custom()
            .setDefaultRequestConfig(RequestConfig.custom()
                    .setCookieSpec(CookieSpecs.STANDARD).build())
            .build();
    

    【讨论】:

    • 你成功了。我正在使用springboot resttemplate,它需要一个额外的步骤来设置HttpComponentsClientHttpRequestFactory对象的httpclient,然后将其传递给resttemplate
    • 这里是 HttpClient 的 jira 中这种行为的报告,开发人员建议同样的事情:issues.apache.org/jira/browse/HTTPCLIENT-1763
    • 是否有不再需要设置的 http 客户端版本?将 cookie 规范设置为“标准”对我来说似乎是一个明智的默认设置。
    【解决方案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();
      

      【讨论】:

      • 将定制器设置为组件就足够了。 SpringBoot 自动拾取,无需使用 restTemplate 构建器。
      【解决方案4】:

      解决方法:

      System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http.client.protocol.ResponseProcessCookies", "fatal");
      

      【讨论】:

      • 请注意,根据使用的日志库,您可能需要不同的语法。请参阅stackoverflow.com/questions/5188118/… 了解替代方案。
      • 对于 log4j2:Configurator.setLevel("org.apache.http.client.protocol.ResponseProcessCookies", Level.FATAL);
      • 这不是“解决”任何问题,只是隐藏了错误。
      • 引用问题:“我并不真正关心我用例中的 cookie 任何只允许我停止显示警告的解决方案(除了重定向标准错误,原因我需要那个)是受欢迎的。”
      猜你喜欢
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多