Java爬虫(六)-- httpClient进阶:超时时间设置+cookie保存策略
2018-03-15 14:57
1021 查看
一、前言
本文主要介绍httClient超时时间设置,以及cookie保存策略设置。二、超时时间设置
httpClient内部有三个超时时间设置:connectTimeout – 连接超时
指的是连接目标url的连接超时时间,即客服端发送请求到与目标url建立起连接的最大时间。如果在该时间范围内还没有建立起连接,则就
抛出
connectionTimeOut异常。如测试的时候,将url改为一个不存在的url:
"http://test.com",超时时间3000ms过后,系统报出异常:
org.apache.commons.httpclient.ConnectTimeoutException:The host did not accept the connection within timeout of 3000 ms
connectionRequestTimeout – 连接池获取可用连接超时(使用连接池之后需要设置)
httpClient中的要用连接时尝试从连接池中获取,若是在等待了一定的时间后还没有获取到可用连接(比如连接池中没有空闲连接了)则会抛出获取连接超时异常。
socketTimeout – 读取数据超时
设置超时时间的意义在于,让你知道在哪个地方出问题了。就比如如果请求返回超时,如果你没设置读取数据超时,程序就会一直卡在那个地方,也不会报错。
httpClient4.5版本之后,这几个参数的设置就集成抽象到了
RequestConfig中,具体的例子如下:
RequestConfig defaultRequestConfig = RequestConfig.custom() .setSocketTimeout(10000) .setConnectTimeout(5000) .setConnectionRequestTimeout(5000) .build(); BasicCookieStore httpClient = HttpClients.custom() .setDefaultRequestConfig(defaultRequestConfig) .build();
cookie保存策略设置
CookieSpec接口代表了cookie管理的规范,cookie管理规范包含如下内容:
解析Set-Cookie头部的规则
验证已解析cookie的规则
为已给定主机,端口和源路径格式化Cookie头部
httpClient附带多种
CookieSpec实现:
Standard strict:状态管理策略行为完全符合RFC6265第四章的行为定义。
Standard:状态管理策略较为符合RFC6265第四章定义的行为,以期望在不是完全遵守该行为之间的服务器之间进行交互。
Netscape 草案(已过时):该策略遵守Netscape公司公布最初的规范草案,除非确实需要与旧代码兼容,否则尽量避免使用它。
RFC 2965(已过时): 状态管理策略符合过时的RFC2965定义的状态管理规范。请不要在新应用中使用。
RFC2109(已过时):状态管理策略符合过时的RFC2109定义的状态管理规范,请不要在新应用中使用。
Browser compatibility(已过时):该策略尝试尽量去模拟老旧的浏览器版本如微软IE和Mozilla FireFox,请不要在新应用中使用。
Default:默认cookie策略是一种综合性的策略,其基于HTTP response返回的cookie属性如version信息,过期信息,与RFC2965,RFC2109或者Netscape草案兼容,该策略将会在下一个HttpClient小版本(基于RFC6265)中废弃。
Ignore cookies:所有的cookie都被忽略
上面讲这么多估计大家也不会怎么看,会用到的主要是
Standard strict、
Standard,
Ignore cookies也可能会用到。
如果对于cookie解析有定制化的要求,httpClient也允许我们自定义cookie策略。为了实现定制cookie策略,你应该创建一个自定义的
CookieSpec接口的实现,创建一个
CookieSpecProvider的实现类,然后用该实现类去创建和初始化自定义规范的实例,然后使用httpClient进行注册,一旦自定义规范被注册,它就会如同标准cookie规范一样被触发。
具体怎么做不在本篇文章中讲,等我遇到来添上。
怎么设置cookie策略的代码如下:
RequestConfig defaultRequestConfig = RequestConfig.custom() // 防止cookie reject 在新程序中,强烈建议使用Standard或Standard strict策略 .setCookieSpec(CookieSpecs.STANDARD_STRICT) .build(); BasicCookieStore httpClient = HttpClients.custom() .setDefaultRequestConfig(defaultRequestConfig) .build();
参考资料
https://hc.apache.org/httpcomponents-client-ga/tutorial/html/statemgmt.html#d5e515http://blog.csdn.net/u011191463/article/details/78664896
相关文章推荐
- 设置Apache的HttpClient请求时间超时
- HttpClient 4.5.2版本设置连接超时时间-CloseableHttpClient设置Timeout
- 关于http socket timeout 超时时间 未设置 导致线程一直在等待(线程饥饿),微信公众号开发过程遇到的。java
- HttpClientUtils.post不设置超时时间容易导致,请求无法返回
- Java设置Client Socket链接Server超时时间
- HttpClient 4.5版本设置连接超时时间
- Java爬虫(三)-- httpClient 模拟登录 + cookie 登录状态管理
- Java爬虫(五)-- httpClient进阶:使用代理(详细解析)
- Java设置Client Socket链接Server超时时间
- httpclient4 请一定设置超时时间
- cxf和HttpClient调用WebService,并设置超时时间
- java-commons-HttpClient超时设置setConnectionTimeout和setSoTimeout
- httpclient发送http请求设置网络超时时间
- java-commons-HttpClient超时设置setConnectionTimeout和setSoTimeout
- Apache HttpClient调用服务没有设置超时时间引起的血崩
- HttpClient 4.5.2版本设置连接超时时间-CloseableHttpClient设置Timeout
- Java爬虫(七)- httpClient进阶: https 和 证书认证(讲故事篇)
- httpClient 超时时间设置(转)
- java设置http超时时间
- HttpClient 4.5版本设置连接超时时间