1. 程式人生 > >使用httpclient傳送get或post請求

使用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/