使用httpclient傳送get或post請求
HttpClient 是 Apache Jakarta Common 下的子專案,可以用來提供高效的、最新的、功能豐富的支援 HTTP 協議的客戶端程式設計工具包,並且它支援 HTTP 協議最新的版本和建議。當前官網最新版介紹頁是:http://hc.apache.org/httpcomponents-client-4.5.x/index.html
許多模擬http請求的框架都用httpclient,測試人員可通過它模擬請求http協議介面,做介面自動化測試。
1、包下載:
地址:http://mvnrepository.com/
<!-- maven依賴--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version> </dependency>
傳送get請求
1、通過請求引數url和標頭檔案cookie作為引數(cookie可以為空)傳送get請求,讀取返回內容
程式碼如下:
public static String httpGet(String url,String cookie) throws Exception{ String result=""; //返回資訊 //建立一個httpGet請求 HttpGet request=new HttpGet(url); //建立一個htt客戶端 @SuppressWarnings("resource") HttpClient httpClient=new DefaultHttpClient();//新增cookie到標頭檔案 request.addHeader("Cookie", cookie); //接受客戶端發回的響應 HttpResponse httpResponse=httpClient.execute(request); //獲取返回狀態 int statusCode=httpResponse.getStatusLine().getStatusCode(); if(statusCode==HttpStatus.SC_OK){ //得到客戶段響應的實體內容 HttpEntity responseHttpEntity=httpResponse.getEntity(); //得到輸入流 InputStream in=responseHttpEntity.getContent(); //得到輸入流的內容 result=getData(in); } //Log.d(TAG, statusCode+""); return result; }
2、有時候,當我們想獲取返回標頭檔案資訊,而不是返回內容時,只需要修改:
//獲取返回狀態 int statusCode=httpResponse.getStatusLine().getStatusCode(); if(statusCode==HttpStatus.SC_OK){ //取標頭檔案名(header值)資訊 strResult=httpResponse.getHeaders(header)[0].getValue().toString(); // Header[] headers = httpResponse.getAllHeaders();//返回的HTTP頭資訊 // for (int i=0; i<headers.length; i++) { // System.out.println(headers[i]); // } }
傳送post請求
1、請求地址、請求引數(map格式)、請求cookie作為引數傳送Post請求
public static String httpPost(String url,Map<String,String> map,String cookie) { //返回body String body = ""; //1、建立一個htt客戶端 @SuppressWarnings("resource") HttpClient httpClient=new DefaultHttpClient(); //2、建立一個HttpPost請求 HttpPost response=new HttpPost(url); //3、設定引數 //建立一個NameValuePair陣列,用於儲存欲傳送的引數 List<NameValuePair> params = new ArrayList<NameValuePair>(); if(map!=null){ for (Entry<String, String> entry : map.entrySet()) { //新增引數 params.add( new BasicNameValuePair(entry.getKey(),entry.getValue()) ); } } //4、設定引數到請求物件中 try { response.setEntity(new UrlEncodedFormEntity(params, "utf-8")); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } //5、設定header資訊 response.setHeader("Content-type", "application/x-www-form-urlencoded"); response.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); //新增cookie到標頭檔案 response.addHeader("Cookie", cookie); //6、設定編碼 //response.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8)); //7、執行post請求操作,並拿到結果(同步阻塞) CloseableHttpResponse httpResponse; try { httpResponse = (CloseableHttpResponse) httpClient.execute(response); //獲取結果實體 HttpEntity entity = httpResponse.getEntity(); if (entity != null) { //按指定編碼轉換結果實體為String型別 body = EntityUtils.toString(entity, "utf-8"); } EntityUtils.consume(entity); //釋放連結 httpResponse.close(); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return body; }
2、post請求獲取標頭檔案header資訊
//7執行post請求
HttpResponse response = httpClient.execute(httpPost); //取頭資訊 Header[] headers = response.getAllHeaders(); for(int i=0;i<headers.length;i++) { System.out.println(headers[i].getName() +"=="+ headers[i].getValue()); }
3、addHeader與setHeader區別
HttpClient在新增標頭檔案的時候,需要用到addHeader或setHeader
區別:
1、同名Header可以有多個 ,Header[] getHeaders(String name)。
2、執行時使用的是第一個, Header getFirstHeader(String name)。
3、addHeader,如果同名header已存在,則追加至原同名header後面。
4、setHeader,如果同名header已存在,則覆蓋一個同名header。
2、原始碼
連結:http://files.cnblogs.com/files/airsen/HttpClientUtil.rar
參考
1、httpclient中文翻譯:http://blog.csdn.net/column/details/httpclient.html
2、httpclient翻譯:http://blog.csdn.net/linghu_java/article/details/43306613
3、輕鬆把玩HttpClient之模擬post請求示例:http://blog.csdn.net/xiaoxian8023/article/details/49863967
4、http://www.codeweblog.com/httpclient-%E6%93%8D%E4%BD%9C%E5%B7%A5%E5%85%B7%E7%B1%BB/