接口测试的第一步就是需要发送接口请求,获取到响应数据
因为每个请求内部实现都是一样的,不同的只是请求参数、地址等信息,所以为了可复用,需要先封装请求方式,即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发送请求呢?
- 创建HttpClient对象
- 创建请求方法的实例,并指定请求URL
如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象 - 发送请求参数,可调用HttpGet、HttpPost共同的setParams方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity方法来设置请求参数
添加请求头,可通过addHeader()方法 - 调用HttpClient对象的execute()发送请求
- 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头
调用HttpResponse的getEntity()方法可获取服务器的响应内容 - 释放连接。无论执行方法是否成功,都必须释放连接
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的域名会变,所以为了避免每次都修改很多文件,我们需要将它们写入配置文件中,通过配置文件读写
注:地址替换方法封装详见地址替换方法封装
代码修改如下:
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
网友评论