二、傳送請求,獲取響應資料

weixin_33866037發表於2018-01-30

介面測試的第一步就是需要傳送介面請求,獲取到響應資料

因為每個請求內部實現都是一樣的,不同的只是請求引數、地址等資訊,所以為了可複用,需要先封裝請求方式,即HTTP的常用請求GET、POST,然後不同的介面通過呼叫該方法獲取到響應資料

分析請求內容如下:

  • 一個請求包括頭部,請求URL,請求引數等
  • 固定的頭部可寫在配置檔案中(如ContentType等),可變的頭部通過引數傳遞(如token等)
  • 請求URL包括域名和地址,每個請求的地址是不確定的,所以會通過引數傳遞
    但是域名只有幾個,包括開發環境,測試環境,預發環境和生產環境,所以可寫在配置檔案中

前提條件:
先在pom檔案中新增依賴包httpclient、json-lib

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.2</version>
        </dependency>

        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.1</version>
            <classifier>jdk15</classifier>
        </dependency>

如何通過HttpClient傳送請求呢?

  1. 建立HttpClient物件
  2. 建立請求方法的例項,並指定請求URL
    如果需要傳送GET請求,建立HttpGet物件;如果需要傳送POST請求,建立HttpPost物件
  3. 傳送請求引數,可呼叫HttpGet、HttpPost共同的setParams方法來新增請求引數;對於HttpPost物件而言,也可呼叫setEntity方法來設定請求引數
    新增請求頭,可通過addHeader()方法
  4. 呼叫HttpClient物件的execute()傳送請求
  5. 呼叫HttpResponse的getAllHeaders()、getHeaders(String name)等方法可獲取伺服器的響應頭
    呼叫HttpResponse的getEntity()方法可獲取伺服器的響應內容
  6. 釋放連線。無論執行方法是否成功,都必須釋放連線
public JSONObject post(String url, List<NameValuePair> params, List<NameValuePair> headers, String encoding){

        JSONObject response = null;
        try{
            CloseableHttpClient httpClient = HttpClients.createDefault();
            HttpPost httpPost = new HttpPost(url);

            JSONObject json = new JSONObject();
            for(int i=0;i<params.size();i++){
                json.put(params.get(i).getName(),params.get(i).getValue());
            }
            StringEntity entity = new StringEntity(json.toString(),encoding);
            httpPost.setEntity(entity);

            if(headers != null){
                for(int i=0;i<headers.size();i++){
                    httpPost.addHeader(headers.get(i).getName(),headers.get(i).getValue());
                }
            }

            HttpResponse httpResponse = httpClient.execute(httpPost);
            if(httpResponse.getStatusLine().getStatusCode() == 200){
                String result = EntityUtils.toString(httpResponse.getEntity());
                response = JSONObject.fromObject(result);
            }
            
            httpPost.abort();
            httpClient.close();

        }catch (Exception e){
            e.printStackTrace();

        }
        return response;

    }

將域名放在配置檔案中

上面說過URL的域名會變,所以為了避免每次都修改很多檔案,我們需要將它們寫入配置檔案中,通過配置檔案讀寫
注:地址替換方法封裝詳見地址替換方法封裝
程式碼修改如下:

3830714-c08abef330c82808.png
地址替換.png

get請求如下:

public JSONObject get(String projName,String url, List<NameValuePair> params, List<NameValuePair> headers, String encoding){

        JSONObject response = null;
        try{
            String uri = DNSReplacement.replacedURL(url,projName)+"?"+ EntityUtils.toString(new UrlEncodedFormEntity(params,encoding));//拼接域名和地址和?後引數

            CloseableHttpClient httpClient = HttpClients.createDefault();
            HttpGet httpGet = new HttpGet(uri);

            if(headers != null){
                for(int i=0;i<headers.size();i++){
                    httpGet.addHeader(headers.get(i).getName(),headers.get(i).getValue());
                }
            }

            HttpResponse httpResponse = httpClient.execute(httpGet);
            if(httpResponse.getStatusLine().getStatusCode() == 200){
                String result = EntityUtils.toString(httpResponse.getEntity());
                response = JSONObject.fromObject(result);
            }

            httpGet.abort();
            httpClient.close();

        }catch (Exception e){
            e.printStackTrace();

        }
        return response;

    }

如此,我們就基本完成了請求的封裝,得到一個公用類(Request),當然我們還可以再封裝一層,將get、post方法變成private,然後增加一個方法,通過傳入的引數中增加請求型別(GET or POST),根據請求型別呼叫不同方法實現
其他可根據自己專案情況做不同修改以適應專案需求

參考文章:
https://www.cnblogs.com/boris-et/p/7922267.html
http://blog.csdn.net/zknxx/article/details/51598852

相關文章