輕鬆把玩HttpClient之封裝HttpClient工具類(五),攜帶Cookie的請求
阿新 • • 發佈:2018-12-29
最近更新了一下HttpClientUtil工具類程式碼,主要是添加了一個引數HttpContext,這個是用來幹嘛的呢?其實是用來儲存和傳遞Cookie所需要的。因為我們有很多時候都需要登入,然後才能請求一些想要的資料。而在這以前使用HttpClientUtil工具類,還不能辦到。現在更新了以後,終於可以了。
先說一下思路:本次的demo,就是獲取csdn中的c幣,要想獲取c幣,必須先登入。而每次登入需要5個引數。其中2個必不可少的引數是使用者名稱和密碼,其他的3個引數,是需要從登入頁面獲取的。在第一次請求登入頁面,只要設定了CookieStore,就可以自動獲取cookie了,然後從返回的html原始碼中獲取引數,再組裝新增使用者名稱密碼,然後第二次登入,如果返回的html原始碼中有“帳號登入”這幾個字,就說明登入失敗了。否則登入成功。可以列印一下cookie(已註釋)。然後再訪問c幣查詢的頁面,就可以從返回的html原始碼中解析到c幣的值了。登入時需要注意的是:直接提交使用者名稱密碼或者第二次登入不攜帶context引數,是不能登入成功的。
具體程式碼如下:
從html原始碼中解析引數和c幣值所用到的一個方法: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); }
測試結果:/** * 通過正則表示式獲取內容 * * @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引數,也是可以做到的。