发送请求和解析响应—测试框架视频解读

2022年01月15日 阅读数:8
这篇文章主要向大家介绍发送请求和解析响应—测试框架视频解读,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

前两期视频讲了一些基础内容,连接以下:git

  • FunTester测试框架视频讲解(序)
  • 获取HTTP请求对象--测试框架视频讲解

今天开始讲最核心的功能,发送请求和解析响应,包括处理请求头,cookie,响应结果的处理等等。json

数据格式我一概是采用​​JSonobject​​​格式,无论是​​header​​​仍是​​cookie​​​,包括接口参数,只要是符合​​key-value​​​这种形式的,均使用​​json​​数据格式。api

解析响应的最终结果也是返回​​json​​​对象,里面包括了包括​​set-cookie​​和重定向等内容。方法中包含了两种记录请求响应以及发送不一样级别预警的方法,由于开箱即用,没啥太多难度,本期就不讲了,之后有机会补上。cookie

  • 点击阅读观看视频

gitee地址:gitee.com/fanapi/test…框架

代码以下:ide

/**
* 发送请求以前,配置请求管理器,设置IP,user_agent和cookie
*
* @param request
*/
protected static void beforeRequest(HttpRequestBase request) {
HttpClientConstant.COMMON_HEADER.forEach(header -> request.addHeader(header));
}

/**
* 响应结束以后,处理响应头信息,如set-cookien内容
*
* @param response 响应内容
* @return
*/
private static JSONObject afterResponse(CloseableHttpResponse response) {
JSONObject cookies = new JSONObject();
List<Header> headers = Arrays.asList(response.getHeaders("Set-Cookie"));
if (headers.size() == 0) return cookies;
headers.forEach(x -> {
String[] split = x.getValue().split(";")[0].split("=", 2);
cookies.put(split[0], split[1]);
});
return cookies;
}

/**
* 根据解析好的content,转化json对象
*
* @param content
* @return
*/
private static JSONObject getJsonResponse(String content, JSONObject cookies) {
JSONObject jsonObject = new JSONObject();
try {
if (StringUtils.isEmpty(content)) ParamException.fail("响应为空!");
jsonObject = JSONObject.parseObject(content);
} catch (JSONException e) {
jsonObject = getJson("content=" + content, "code=" + TEST_ERROR_CODE);
logger.warn("响应体非json格式,已经自动转换成json格式!");
} finally {
if (!cookies.isEmpty()) jsonObject.put(HttpClientConstant.COOKIE, cookies);
return jsonObject;
}
}


/**
* 根据响应获取响应实体
*
* @param response
* @return
*/
public static String getContent(CloseableHttpResponse response) {
HttpEntity entity = response.getEntity();// 获取响应实体
String content = EMPTY;
try {
content = EntityUtils.toString(entity, DEFAULT_CHARSET);// 用string接收响应实体
EntityUtils.consume(entity);// 消耗响应实体,并关闭相关资源占用
} catch (Exception e1) {
logger.warn("解析响应实体异常!", e1);
}
return content;
}

/**
* 获取响应状态,处理重定向的url
*
* @param response
* @param res
* @return
*/
public static int getStatus(CloseableHttpResponse response, JSONObject res) {
int status = response.getStatusLine().getStatusCode();
if (status != HttpStatus.SC_OK) logger.warn("响应状态码错误:{}", status);
if (status == HttpStatus.SC_MOVED_TEMPORARILY)
res.put("location", response.getFirstHeader("Location").getValue());
return status;
}

/**
* 获取响应实体
* <p>会自动设置cookie,可是须要各个项目再自行实现cookie管理</p>
* <p>该方法只会处理文本信息,对于文件处理能够调用两个过时的方法解决</p>
*
* @param request 请求对象
* @return 返回json类型的对象
*/
public static JSONObject getHttpResponse(HttpRequestBase request) {
if (!isRightRequest(request)) RequestException.fail(request);
beforeRequest(request);
JSONObject res = new JSONObject();
RequestInfo requestInfo = new RequestInfo(request);
if (HEADER_KEY) output("===========request header===========", Arrays.asList(request.getAllHeaders()));
long start = Time.getTimeStamp();
try (CloseableHttpResponse response = ClientManage.httpsClient.execute(request)) {
long end = Time.getTimeStamp();
long elapsed_time = end - start;
if (HEADER_KEY) output("===========response header===========", Arrays.asList(response.getAllHeaders()));
int status = getStatus(response, res);
JSONObject setCookies = afterResponse(response);
String content = getContent(response);
int data_size = content.length();
res.putAll(getJsonResponse(content, setCookies));
int code = iBase == null ? -2 : iBase.checkCode(res, requestInfo);
if (iBase != null && !iBase.isRight(res))
new AlertOver("响应状态码错误:" + status, "状态码错误:" + status, requestInfo.getUrl(), requestInfo).sendSystemMessage();
MySqlTest.saveApiTestDate(requestInfo, data_size, elapsed_time, status, getMark(), code, LOCAL_IP, COMPUTER_USER_NAME);
if (SAVE_KEY) FunRequest.save(request, res);
} catch (Exception e) {
logger.warn("获取请求相应失败!", e);
if (!requestInfo.isBlack())
new AlertOver("接口请求失败", requestInfo.toString(), requestInfo.getUrl(), requestInfo).sendSystemMessage();
} finally {
HEADER_KEY = false;
if (!requestInfo.isBlack()) {
lastRequest = request;
}
}
return res;
}

/**
* 判断请求是不是正确的,目前主要过滤一些不完整的请求和超长的url
*
* @param request
* @return
*/
private static boolean isRightRequest(HttpRequestBase request) {
String url = request.getURI().toString().toLowerCase();
return !StringUtil.isNullOrEmpty(url) && url.startsWith("http");
}

  • 郑重声明:公众号“FunTester”,禁止第三方(腾讯云除外)转载、发表。