前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >发送请求和解析响应—测试框架视频解读

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

作者头像
FunTester
发布2020-03-23 14:30:36
4320
发布2020-03-23 14:30:36
举报
文章被收录于专栏:FunTesterFunTester

前两期视频讲了一些基础内容,链接如下:

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

数据格式我一律是采用JSonobject格式,不管是header还是cookie,包括接口参数,只要是符合key-value这种形式的,均使用json数据格式。

解析响应的最终结果也是返回json对象,里面包括了包括set-cookie和重定向等内容。方法中包含了两种记录请求响应以及发送不同级别预警的方法,因为开箱即用,没啥太多难度,本期就不讲了,以后有机会补上。http://mpvideo.qpic.cn/0bf27yaaiaaavmanv5drorpfb7wdat7aabaa.f10002.mp4?dis_k=fa21719a3d9bd5ca609bafa7a4be4d88&dis_t=1584944939

点击阅读原文访问gitee地址

代码如下:

  /**
     * 发送请求之前,配置请求管理器,设置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”,禁止第三方(腾讯云除外)转载、发表。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档