JAVA: httpclient 详解——第三章;

相对于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();

	}


JAVA: httpclient 详解——第三章;

上一篇:python 正则表达式判断邮箱格式是否正确


下一篇:全面理解面向对象的 JavaScript