前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >httpclient处理多用户同时在线

httpclient处理多用户同时在线

作者头像
FunTester
发布于 2019-08-21 08:03:07
发布于 2019-08-21 08:03:07
1.6K00
代码可运行
举报
文章被收录于专栏:FunTesterFunTester
运行总次数:0
代码可运行

在使用httpclient做接口相关测试的过程中,遇到过一个障碍:如何处理多用户同时登陆。之前用户身份凭证一般都是做公参里面处理或者在header中单独定义一个或者几个字段,cookie都是使用httpclient自带的管理器自动管理的。

后来用户凭证存到了cookie里,这里就有了一些障碍,经过翻看资料得到了解决。

首先取消cookie的自动管理

设置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /**
     * 获取请求超时控制器
     * <p>
     * cookieSpec:即cookie策略。参数为cookiespecs的一些字段。作用:
     * 1、如果网站header中有set-cookie字段时,采用默认方式可能会被cookie reject,无法写入cookie。将此属性设置成CookieSpecs.STANDARD_STRICT可避免此情况。
     * 2、如果要想忽略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对象的设置里面,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /**
     * 通过连接池获取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对象作为返回体的时候添加进去,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /**
     * 响应结束之后,处理响应头信息,如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,以对象形式存储每一个用户,达到多用户同时登录的目的,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @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会失效,由于没有做通知改变功能(多线程编程搞不定),所以测试的时候统一采用了线程绑定用户的模式,一个线程对应一个用户,防止发生混乱。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
httpclient如何处理302重定向
在使用httpclient做接口测试的时候,遇到了一个重定向的接口,由于框架原因导致的必需得重定向到另外一个域名的接口完成功能。在之前未遇到这个的情况,经过修改请求方法解决了这个问题。大致思路是:如果发现是HTTP code是302,就会去header数组里面找location的字段,把字段的结果放到响应体里面,我的响应体是json格式的。
FunTester
2019/09/04
3.2K0
发送请求和解析响应—测试框架视频解读
今天开始讲最核心的功能,发送请求和解析响应,包括处理请求头,cookie,响应结果的处理等等。
FunTester
2020/03/23
4610
如何保存HTTPrequestbase和CloseableHttpResponse
在测试过程中,有一个重要的工作就是保存记录“现场”,以方便开发人员更快发现BUG解决问题。在接口测试中更是如此,如果开发人员能够根据BUG的信息直接复现请求,是一件很方便的事情。为此我想了一个再框架中增加保存HTTPrequestbase和CloseableHttpResponse两个对象的功能,其中主要是HTTPrequestbase的信息,CloseableHttpResponse以响应内容为主,因为每次请求我都会把必要信息(host,API,HTTP code,响应code,响应时间等等记录)。
FunTester
2020/01/10
9570
单点登录性能测试方案
项目登录系统升级,改为单点登录:英文全称Single Sign On。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 之前有的统一登录方式被废弃,由于单点登录比较之前的登录系统复杂很多。之前的方案请求一个接口即可获得用户校验令牌。 先分享一下单点登录的技术方案的时序图:
FunTester
2019/10/08
1.6K0
单点登录性能测试方案
自动化项目基类实践--视频演示
接口测试中业务验证 http://mpvideo.qpic.cn/0bf2raaagaaaauaafxudrvpfbcgdaoeaaaya.f10002.mp4?dis_k=c999f00b893c9
FunTester
2020/04/08
3110
拷贝HttpRequestBase对象
在实践性能测试框架第二版的过程中,我实现了一个单个HttpRequestBase对象的concurrent对象创建,单之前都是用使用唯一的HttpRequestBase对象进行多线程请求,目前来看是没有问题的,但为了防止以后出现意外BUG和统一concurrent的构造方法使用,故尝试拷贝了一个HttpRequestBase对象。原因是因为之前封装的深拷贝方法对于HttpRequestBase对象的实现类如:httpget和httppost并不适用,因为没有实现Serializable接口。所以单独写了一个HttpRequestBase对象的拷贝方法,供大家参考。
FunTester
2019/12/31
5740
HTTP接口测试基础【FunTester框架教程】
今天继续编写FunTester测试框架的教程,主要内容是HTTP接口测试基础,分为请求(GET、POST、PUT等)、请求头、cookie、响应、JSON以及资源释放。
FunTester
2021/09/14
5540
分布式性能测试框架用例方案设想(一)
在近期工作规划中,分布式压测框架提上日程,目前「FunTester」已经具备了一些分布式压测中用到的功能。
FunTester
2021/06/23
7150
工具篇:apache-httpClient 和 jdk11-HttpClient的使用
apache HttpClient 是 java项目里 较为常用的组件之一;对接外部服务时,各个商家提供的接口是各式各样的,有自己的要求,因此要定制对应的请求客户端。httpClient是一个不错的选择
潜行前行
2021/12/02
1.9K0
工具篇:apache-httpClient 和 jdk11-HttpClient的使用
HttpClient4.4 登录知乎(详细过程)
HttpClient是java语言下一个支持http协议的客户端编程工具包,它实现了HTTP协议的所有方法,但是不支持JS渲染。我们在做一些小玩意时,有可能需要登录某些网站获取信息,那么HttpClient就是你的好帮手,废话不多说,进入实战。
zhangheng
2020/04/28
1.4K0
HttpClient-Header、Cookie
内容格式设定为Json格式("content-type", "application/json")、自定义Header("Self-Header", "MySelfHeader")。
wangmcn
2022/07/25
6440
HttpClient-Header、Cookie
测试框架-TestNG-结合Selenium、Appium、OkHttp、HttpClient的简单示例
4、执行脚本(testng.xml鼠标右键Run As--->TestNG Suite)。
wangmcn
2022/07/25
1.4K0
测试框架-TestNG-结合Selenium、Appium、OkHttp、HttpClient的简单示例
封装httpClient工具类进行get、post、put、delete的http接口请求,可添加请求头与参数,支持多线程
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/157763.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/18
2.6K0
httpclient使用HTTP代理实践
最近在做测试的时候遇到一个问题:就是内部网络做了限制,「部分服务只有在机房的网段内才能访问」。
FunTester
2020/08/19
7550
JavaUtil_06_HttpUtil_使用httpclient实现
一、简介 使用 appache 的 httpclient 来实现的 二、源码 package com.ray.weixin.gz.util; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import org.apache.http.Consts; import org.apache.http.Header; import org.
shirayner
2018/08/10
9290
Java使用httpclient提交HttpPost请求(form表单提交,File文件上传和传输Json数据)
HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。Java后台使用httpclient主要目的是为了模拟客户端的请求。
I Teach You 我教你
2023/07/18
3.2K0
Apache HttpClient4使用教程
HttpClient默认情况 会对302、307的GET和HEAD请求以及所有的303状态码做重定向处理
全栈程序员站长
2022/09/15
7660
Apache HttpClient 5 使用详细教程
超文本传输协议(HTTP)可能是当今互联网上最重要的协议之一,Web 服务、微服务以及支持网络的各种设备上的服务几乎都是 HTTP 协议,HTTP 协议已经从 Web 浏览器走向了更广泛的使用场景。
未读代码
2022/11/21
6.5K0
Apache HttpClient 5 使用详细教程
Java TCP/UDP/HttpClient简单理解
​ 服务端socket处理客户端socket连接是需要一定时间的。ServerSocket有一个队列,存放还没有来得及处理的客户端Socket,这个队列的容量就是backlog的含义。如果队列已经被客户端socket占满了,如果还有新的连接过来,那么ServerSocket会拒绝新的连接。也就是说backlog提供了容量限制功能,避免太多的客户端socket占用太多服务器资源。 ​ 客户端每次创建一个Socket对象,服务端的队列长度就会增加1个。服务端每次accept(),就会从队列中取出一个元素。
小锋学长生活大爆炸
2022/03/29
5920
Java TCP/UDP/HttpClient简单理解
Java TCP/UDP/HttpClient简例
​ 服务端socket处理客户端socket连接是需要一定时间的。ServerSocket有一个队列,存放还没有来得及处理的客户端Socket,这个队列的容量就是backlog的含义。如果队列已经被客户端socket占满了,如果还有新的连接过来,那么ServerSocket会拒绝新的连接。也就是说backlog提供了容量限制功能,避免太多的客户端socket占用太多服务器资源。 ​ 客户端每次创建一个Socket对象,服务端的队列长度就会增加1个。服务端每次accept(),就会从队列中取出一个元素。
小锋学长生活大爆炸
2020/09/21
8570
推荐阅读
相关推荐
httpclient如何处理302重定向
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验