httpclient处理多用户同时在线

在使用httpclient作接口相关测试的过程当中,遇到过一个障碍:如何处理多用户同时登录。以前用户身份凭证通常都是作公参里面处理或者在header中单独定义一个或者几个字段,cookie都是使用httpclient自带的管理器自动管理的。 后来用户凭证存到了cookie里,这里就有了一些障碍,通过翻看资料获得了解决。java

首先取消cookie的自动管理

设置以下:编程

/**
     * 获取请求超时控制器
     * <p>
     * cookieSpec:即cookie策略。参数为cookiespecs的一些字段。做用:
     * 一、若是网站header中有set-cookie字段时,采用默认方式可能会被cookie reject,没法写入cookie。将此属性设置成CookieSpecs.STANDARD_STRICT可避免此状况。
     * 二、若是要想忽略cookie访问,则将此属性设置成CookieSpecs.IGNORE_COOKIES。
     * </p>
     *
     * @return
     */
    private static RequestConfig getRequestConfig() {
        return RequestConfig.custom().setConnectionRequestTimeout(HttpClientConstant.CONNECT_REQUEST_TIMEOUT).setConnectTimeout(HttpClientConstant.CONNECT_TIMEOUT).setSocketTimeout(HttpClientConstant.SOCKET_TIMEOUT).setCookieSpec(CookieSpecs.IGNORE_COOKIES).setRedirectsEnabled(false).build();
    }

这里说明一点,这个requestconfig既能够在对HTTPrequestbase进行设置,也能够对CloseableHttpClient进行设置,因为在各个项目中都采起了单独处理cookie的设置,因此我是直接放在了链接池CloseableHttpClient对象的设置里面,以下:json

/**
     * 经过链接池获取https协议请求对象
     * <p>
     * 此处会默认添加一天defaultcookiesstore,会处理响应头中的set-cookie字段
     * 增长默认的请求控制器
     * </p>
     *
     * @return
     */
    private static CloseableHttpClient getCloseableHttpsClients() {
        // 建立自定义的httpsclient对象
        CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).setRetryHandler(httpRequestRetryHandler).setDefaultRequestConfig(requestConfig).build();
//         CloseableHttpClient client = HttpClients.createDefault();//非链接池建立
        return client;
    }

其次处理set-cookie信息

个人方案是在处理响应的时候,只用closeablehttpresponse对象接收响应的,而后在单独在header里面遍历set-cookie字段的值,在处理json对象做为返回体的时候添加进去,以下:cookie

/**
     * 响应结束以后,处理响应头信息,如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 {
            jsonObject = JSONObject.fromObject(content);
        } catch (Exception e) {
            jsonObject.put("content", content);
            jsonObject.put("code", TEST_ERROR_CODE);
            logger.warn("响应体非json格式,已经自动转换成json格式!");
        } finally {
            if (!cookies.isEmpty()) jsonObject.put(HttpClientConstant.COOKIE, cookies);
            return jsonObject;
        }
    }

最后处理多用户保存和携带cookie

在每一个项目的base对象接收到响应以后存储cookie以便子类继承,在每次发送请求的时候带上当前对象的cookie,以对象形式存储每个用户,达到多用户同时登陆的目的,以下:多线程

@Override
    public JSONObject getResponse(HttpRequestBase httpRequestBase) {
        setHeaders(httpRequestBase);
        JSONObject response = FanLibrary.getHttpResponse(httpRequestBase);
        handleResponseHeader(response);
        return response;
    }

    @Override
    public void setHeaders(HttpRequestBase httpRequestBase) {
        httpRequestBase.addHeader(Common.REQUEST_ID);
        httpRequestBase.addHeader(FanLibrary.getHeader("token", token));
        if (!cookies.isEmpty()) httpRequestBase.addHeader(FanLibrary.getCookies(cookies));
    }

    @Override
    public void handleResponseHeader(JSONObject response) {
        if (!response.containsKey(HttpClientConstant.COOKIE)) return;
        cookies.putAll(response.getJSONObject(HttpClientConstant.COOKIE));
        response.remove(HttpClientConstant.COOKIE);
    }
  • 在多用户多线程请求的场景下,在初始化每个对象的时候小几率会发生一些问题:可能同一个对象会被初始化屡次,这样在第二次初始化以前建立的子类对象存储的cookie会失效,因为没有作通知改变功能(多线程编程搞不定),因此测试的时候统一采用了线程绑定用户的模式,一个线程对应一个用户,防止发生混乱。

往期文章精选

  1. java一行代码打印心形
  2. Linux性能监控软件netdata中文汉化版
  3. 接口测试代码覆盖率(jacoco)方案分享
  4. 性能测试框架
  5. 如何在Linux命令行界面愉快进行性能测试
  6. 图解HTTP脑图
  7. 写给全部人的编程思惟
  8. 测试之JVM命令脑图
  9. 将json数据格式化输出到控制台
  10. 如何测试几率型业务接口
  11. “双花”BUG的测试分享
  12. 将swagger文档自动变成测试代码
  13. Mac+httpclient高并发配置实例
  14. httpclient处理多用户同时在线

公众号地图 ☢️ 一块儿来~FunTester

相关文章
相关标签/搜索