相对于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(); }
时间: 2024-10-10 15:17:57