相对于httpurlconnection ,httpclient更加丰富,也更加强大,其中apache有两个项目都是httpclient,一个是commonts包下的,这个是通用的,更专业的是org.apache.http.包下的,所以我一般用后者;
httpclient可以处理长连接,保存会话,重连接,以及请求过滤器,连接重用等等...
下面是测试代码(全部总结来自官方文档,以及翻译)
须要下载核心包:httpclient-4.3.4.jar ,也可在官网下载:http://hc.apache.org/downloads.cgi
//=========================== 第三章 =================================================
/**
* 最初,Http被设计成一个无状态的协议。
* 网景(netscape)公司,最先在他们的产品中支持http状态管理,并且制定了一些专有规范。
* 但是,现在多数的应用的状态管理机制都在使用网景公司的规范,而网景的规范和官方规定是不兼容的。
*/
private static void test14(){
//=====================================================
//网景版本的Cookie ,网景版本是0 ,标准版本是1
BasicClientCookie netscapeCookie = new BasicClientCookie("name", "value");
netscapeCookie.setVersion(0);
/**
* 跨域访问设置domain方式: “.” + other.com,这样在 other.com域下可以获取cookie
* 如果在同一应用中则设置:
*/
netscapeCookie.setDomain(".other.com");
/**
* 可以在tomcat webapps文件夹下的所有应用共享此cookie
* cookie.setPath("/webapp_b/")只是webapp_b应用才能获取此cookie
*/
netscapeCookie.setPath("/");
//=====================================================
//下面是标准版的cookie(版本为1)
BasicClientCookie stdCookie = new BasicClientCookie("name", "value");
stdCookie.setVersion(1);
stdCookie.setDomain(".mycompany.com");
stdCookie.setPath("/");
stdCookie.setSecure(true);
// 服务器发送过来的属性都必须保留
stdCookie.setAttribute(ClientCookie.VERSION_ATTR, "1");
stdCookie.setAttribute(ClientCookie.DOMAIN_ATTR, ".mycompany.com");
//=====================================================
//创建了Set-Cookie2兼容cookie。
BasicClientCookie2 cookie2 = new BasicClientCookie2("name", "value");
cookie2.setVersion(1);
cookie2.setDomain(".mycompany.com");
cookie2.setPorts(new int[] {80,8080});
cookie2.setPath("/");
cookie2.setSecure(true);
cookie2.setAttribute(ClientCookie.VERSION_ATTR, "1");
cookie2.setAttribute(ClientCookie.DOMAIN_ATTR, ".mycompany.com");
cookie2.setAttribute(ClientCookie.PORT_ATTR, "80,8080");
//=====================================================
//自己实现CookieSpec接口,然后创建一个CookieSpecProvider接口来新建、
//初始化自定义CookieSpec接口,最后把CookieSpecProvider注册到HttpClient中。
//一旦我们注册了自定义策略,就可以像其他标准策略一样使用了。
CookieSpecProvider easySpecProvider = new CookieSpecProvider() {
public CookieSpec create(HttpContext context) {
return new BrowserCompatSpec() {
@Override
public void validate(Cookie cookie, CookieOrigin origin)
throws MalformedCookieException {
// Oh, I am easy
}
};
}
};
Registry<CookieSpecProvider> r = RegistryBuilder
.<CookieSpecProvider> create()
//最佳适配标准工厂
.register(CookieSpecs.BEST_MATCH, new BestMatchSpecFactory())
//BrowserCompatSpecFactory 浏览器兼容标准工厂
.register(CookieSpecs.BROWSER_COMPATIBILITY,new BrowserCompatSpecFactory())
.register("easy", easySpecProvider)
.build();
RequestConfig requestConfig = RequestConfig.custom()
.setCookieSpec("easy")
.build();
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCookieSpecRegistry(r)
.setDefaultRequestConfig(requestConfig)
.build();
}
/**
* cookie持久化
*/
private static void test15(){
CookieStore cookieStore = new BasicCookieStore();
BasicClientCookie cookie = new BasicClientCookie("name", "value");
cookie.setVersion(0);
cookie.setDomain(".mycompany.com");
cookie.setPath("/");
//BasicCookieStore中的Cookie,当载体对象被当做垃圾回收掉后,就会丢失。
cookieStore.addCookie(cookie);
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCookieStore(cookieStore) //设置cookie,供服务器使用
.build();
}
/**
* 通过HttpClientContext 设置cookie 以及cookie标准
*
* CookieSpec对象 代表实际的Cookie规范。
CookieOrigin对象 代表实际的origin server的详细信息。
CookieStore对象 ,这个属性集中的值会取代默认值。
我们也可以在不同的线程中使用不同的执行上下文。
我们在http请求层指定的cookie规范集和cookie store会覆盖在http Client层级的默认值。
*/
private static void test16() throws ClientProtocolException, IOException{
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpClientContext context = HttpClientContext.create();
CookieStore cookieStore = new BasicCookieStore();
//cookieStore 存放cookie.............
Registry<CookieSpecProvider> r = RegistryBuilder
.<CookieSpecProvider> create()
//最佳适配标准工厂
.register(CookieSpecs.BEST_MATCH, new BestMatchSpecFactory())
//BrowserCompatSpecFactory 浏览器兼容标准工厂
.register(CookieSpecs.BROWSER_COMPATIBILITY,new BrowserCompatSpecFactory())
.build();
context.setCookieSpecRegistry(r);
context.setCookieStore(cookieStore);
HttpGet httpget = new HttpGet("http://www.baidu.com");
httpclient.execute(httpget, context);
// Cookie origin details
CookieOrigin cookieOrigin = context.getCookieOrigin();
// Cookie spec used
CookieSpec cookieSpec = context.getCookieSpec();
}