相对于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); // server发送过来的属性都必须保留 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,供server使用 .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(); }