1. 程式人生 > >輕鬆把玩HttpClient之封裝HttpClient工具類(五),攜帶Cookie的請求

輕鬆把玩HttpClient之封裝HttpClient工具類(五),攜帶Cookie的請求

       最近更新了一下HttpClientUtil工具類程式碼,主要是添加了一個引數HttpContext,這個是用來幹嘛的呢?其實是用來儲存和傳遞Cookie所需要的。因為我們有很多時候都需要登入,然後才能請求一些想要的資料。而在這以前使用HttpClientUtil工具類,還不能辦到。現在更新了以後,終於可以了。

       先說一下思路:本次的demo,就是獲取csdn中的c幣,要想獲取c幣,必須先登入。而每次登入需要5個引數。其中2個必不可少的引數是使用者名稱和密碼,其他的3個引數,是需要從登入頁面獲取的。在第一次請求登入頁面,只要設定了CookieStore,就可以自動獲取cookie了,然後從返回的html原始碼中獲取引數,再組裝新增使用者名稱密碼,然後第二次登入,如果返回的html原始碼中有“帳號登入”這幾個字,就說明登入失敗了。否則登入成功。可以列印一下cookie(已註釋)。然後再訪問c幣查詢的頁面,就可以從返回的html原始碼中解析到c幣的值了。登入時需要注意的是:直接提交使用者名稱密碼或者第二次登入不攜帶context引數,是不能登入成功的。

       具體程式碼如下:

	public static void main(String[] args) throws HttpProcessException {
		//登入地址
		String loginUrl = "https://passport.csdn.net/account/login";
		//C幣查詢
		String scoreUrl = "http://my.csdn.net/my/score";
		
		HttpClientContext context = new HttpClientContext();
		CookieStore cookieStore = new BasicCookieStore();
		context.setCookieStore(cookieStore);
		//獲取引數
		String loginform = HttpClientUtil.send(loginUrl, context);
//		System.out.println(loginform);
		System.out.println("獲取登入所需引數");
		String lt = regex("\"lt\" value=\"([^\"]*)\"", loginform)[0];
		String execution = regex("\"execution\" value=\"([^\"]*)\"", loginform)[0];
		String _eventId = regex("\"_eventId\" value=\"([^\"]*)\"", loginform)[0];
		
		//組裝引數
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("username", "使用者名稱");
		map.put("password", "密碼");
		map.put("lt", lt);
		map.put("execution", execution);
		map.put("_eventId", _eventId);

		//傳送登入請求
		String result = HttpClientUtil.send(loginUrl, map, context);
//		System.out.println(result);
		if(result.contains("帳號登入")){//如果有帳號登入,則說明未登入成功
			String errmsg = regex("\"error-message\">([^<]*)<", result)[0];
			System.err.println("登入失敗:"+errmsg);
			return;
		}
		System.out.println("----登入成功----");
		
//		//列印引數,可以看到cookie裡已經有值了。
//		cookieStore = context.getCookieStore();
//		for (Cookie cookie : cookieStore.getCookies()) {
//			System.out.println(cookie.getName()+"--"+cookie.getValue());
//		}
		
		//訪問積分管理頁面
		Header[] headers = HttpHeader.custom().userAgent("Mozilla/5.0").build();
		result = HttpClientUtil.send(scoreUrl, headers, context);
		//獲取C幣
		String score = regex("\"last-img\"><span>([^<]*)<", result)[0];
		System.out.println("您當前有C幣:"+score);
		
	}
	
       從html原始碼中解析引數和c幣值所用到的一個方法:
	/**
	 * 通過正則表示式獲取內容
	 * 
	 * @param regex		正則表示式
	 * @param from		原字串
	 * @return
	 */
	public static String[] regex(String regex, String from){
		Pattern pattern = Pattern.compile(regex); 
		Matcher matcher = pattern.matcher(from);
		List<String> results = new ArrayList<String>();
		while(matcher.find()){
			for (int i = 0; i < matcher.groupCount(); i++) {
				results.add(matcher.group(i+1));
			}
		}
		return results.toArray(new String[]{});
	}
       測試結果:

       最重要的就是context這個引數了,給它設定了cookiestore,那麼會在每次請求時將cookie帶入請求中。或者也可以在header中手動設定cookie引數,也是可以做到的。

       httpclientUtil (QQ交流群:548452686 httpclientUtil交流