本文為原創,轉載請聲明來源和作者,謝謝!
作者:_cha1R
如何用Java代碼模擬一些如百度、QQ之類的網站登錄?有兩個方式,一是發送模擬請求,二是模擬瀏覽器操作,而這兩種方式恰好在Java有開源實現,在這里介紹一個工具包,它是家喻戶曉的HttpClient。
HttpClient 是 Apache Jakarta Common 下的子項目,至於它是干什么用的呢?簡單來說就是:它像瀏覽器一樣支持HTTP協議。既然支持HTTP協議,那意味着瀏覽器能發送的,它也能發送。我想大家都知道登陸的代碼流程,大部分無非就是瀏覽器端以POST方式提交一個form表單,服務器端收到請求后,判斷賬戶密碼做相應處理並且返回結果給瀏覽器端。但是服務器端並不知道是什么給它發送一個請求,它只針對請求作出相應回應。那么我們就可以利用HttpClient模擬以POST請求方式發送一個表單,不過在這之前,先導入相關的Jar包。
commons-codec-1.3.jar
commons-httpclient-3.1.jar
commons-logging-1.1.1.
這三個jar是httpclient必須的jar包,當然你的版本號可以是其他的。
導入完以后,模擬一個HTML表單提交的過程:
首先要構建一個HttpClient,這個HttpClient就像一個瀏覽器,可以用來發送請求。
HttpClient client = new DefaultHttpClient(); //構建一個Client
假設百度的登陸服務器的地址為http://login.baidu.com/,接下來是構建一個POST請求
HttpPost post = new HttpPost("http://login.baidu.com/");//構建一個POST請求 //構建表單參數 List<NameValuePair> formParams = new ArrayList<NameValuePair>(); formParams.add(new BasicNameValuePair("username", "yourname")); formParams.add(new BasicNameValuePair("password", "yourpassword")); UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams, "UTF-8");//將表單參數轉化為“實體” post.setEntity(entity);//將“實體“設置到POST請求里
現在有POST請求,有表單,有參數 ,那下一步就是提交請求到服務器了
HttpResponse response = client.execute(post);//提交POST請求
這樣就已經完整的模擬了一個瀏覽器發送POST請求到服務器。大家注意client.execute()完后,會返回一個HttpResponse.利用這個HttpResponse,我們可以獲取到很多東西,如響應頭,響應內容,響應Cookie,狀態碼,返回的輸入流等等。下面代碼是打印響應的內容:
HttpEntity result = response.getEntity();//拿到返回的HttpResponse的"實體" String content = EntityUtils.toString(result);;//用httpcore.jar提供的工具類將"實體"轉化為字符串打印到控制台 System.out.println(content);
我們可以根據HttpResponse返回的狀態碼、內容等來判斷我們是否已經成功登陸百度:
if(content.contains("登陸成功")){ System.out.println("登陸成功!!!"); }
附上完整代碼以便大家測試:
try { HttpClient client = new DefaultHttpClient(); //構建一個Client HttpPost post = new HttpPost("http://login.baidu.com/"); //構建一個POST請求 //構建表單參數 List<NameValuePair> formParams = new ArrayList<NameValuePair>(); formParams.add(new BasicNameValuePair("username", "yourname")); formParams.add(new BasicNameValuePair("password", "yourpassword")); UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams, "UTF-8");//將表單參數轉化為“實體” post.setEntity(entity); //將“實體“設置到POST請求里 HttpResponse response = client.execute(post);//提交POST請求 HttpEntity result = response.getEntity();//拿到返回的HttpResponse的"實體" String content = EntityUtils.toString(result);; //用httpcore.jar提供的工具類將"實體"轉化為字符串打印到控制台 System.out.println(content); if(content.contains("登陸成功")){ System.out.println("登陸成功!!!"); } } catch (Exception e) { e.printStackTrace(); }
HttpClient可以做的還有很多,這只是初步的一個應用。