【问题标题】:Apache HttpClientBuilder.create().setUserAgent(...) not workingApache HttpClientBuilder.create().setUserAgent(...) 不工作
【发布时间】:2020-04-01 05:36:30
【问题描述】:

这是我创建 HttpClient 的方式:

private String userAgent= "Non empty user agent";
private HttpClient httpClient= HttpClientBuilder.create()
    .setDefaultCookieStore(new BasicCookieStore())
    .setUserAgent(userAgent)
    .setDefaultRequestConfig(RequestConfig.custom()
        .setCookieSpec(CookieSpecs.STANDARD)
        .build())
    .setDefaultHeaders(Arrays.asList(
        new BasicHeader("Accept-Encoding", "gzip"),
        new BasicHeader("Connection", "keep-alive")))
    .build();

但是当发送一些请求时,USER AGENT是empty,这里是日志:

12:51:33.807 [http-nio-5010-exec-9] DEBUG org.apache.http.headers - http-outgoing-0 >> GET / HTTP/1.1
12:51:33.807 [http-nio-5010-exec-9] DEBUG org.apache.http.headers - http-outgoing-0 >> Accept- Encoding: gzip
12:51:33.807 [http-nio-5010-exec-9] DEBUG org.apache.http.headers - http-outgoing-0 >> Host: www.somehost.com
12:51:33.807 [http-nio-5010-exec-9] DEBUG org.apache.http.headers - http-outgoing-0 >> Connection: keep-alive
12:51:33.807 [http-nio-5010-exec-9] DEBUG org.apache.http.headers - http-outgoing-0 >> User-Agent: 

我尝试将用户代理设置为默认标题,如下所示:

.setDefaultRequestConfig(RequestConfig.custom()
    .setCookieSpec(CookieSpecs.STANDARD).build())
.setDefaultHeaders(Arrays.asList(
    new BasicHeader("Accept-Encoding", "gzip"),
    new BasicHeader("Connection", "keep-alive"),
    new BasicHeader("User-Agent", userAgent)))
.build();

但结果相同(用户代理为空)。

这是我发送请求的方式:

HttpResponse httpResponse = httpClient.execute(new HttpGet(baseUrl));

Http 客户端的 maven pom 依赖:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.10</version>
</dependency>

【问题讨论】:

  • 您是否尝试像stackoverflow.com/a/5027588/3329810 中描述的那样使用.setHeader("User-Agent", userAgent) 而不是.setDefaultHeaders() 正常设置标题?
  • 我没有,如果我使用 .setHeader 我必须为我执行的每个请求都这样做,这是有风险的,我可以忘记对某些请求执行 ir,httpClientBuilder 上的 .setDefaultHeaders 是为了为使用 httpClient 执行的每个请求调用 .setHeader

标签: java apache-httpclient-4.x apache-httpcomponents


【解决方案1】:

问题在于实例化顺序:实际上我使用的是 SpringBoot,并且用户代理值是从属性文件加载的,这里是:

 @Value("${com.myapplication.userAgent}")
 private String userAgent;
private HttpClient httpClient= HttpClientBuilder.create()
    .setDefaultCookieStore(new BasicCookieStore())
    .setUserAgent(userAgent)
    .setDefaultRequestConfig(RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build())
    .setDefaultHeaders(Arrays.asList(
            new BasicHeader("Accept-Encoding", "gzip"),
            new BasicHeader("Connection", "keep-alive"))
    )
    .build();

JVM在userAgent发生值注入之前实例化httpClient,所以在实例化httpClient时userAgent值为null。

感谢您的脑力劳动,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 2015-06-16
    • 2014-09-09
    • 2012-12-19
    • 2012-03-20
    • 2012-10-25
    • 2012-09-18
    相关资源
    最近更新 更多