jmeter 提取响应头中的set-Cookie

性能测试时,有一个登录接口, 登录成功后,会返回一个登录凭证token。但这个token不是在响应应答里面返回而是在响应头里面会返回一个set-cookie,如下:

HTTP/1.1 200 OK
Server: hsiar
Date: Fri, 30 Oct 2020 03:24:14 GMT
Content-Type: application/json;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: token=6e204d9b-103a-431e-b8de-ba97b2d1; path=/; HttpOnly
Access-Control-Allow-Origin: 192.168.xx.xxx
Access-Control-Allow-Methods: GET,POST
Access-Control-Allow-Headers: x-msg-timeout,X-Msg-Trace,csrfcheck,ShardingInfo,Partition,broker_key,X-Original-URI,X-Request-Method,Authorization,access_token,login_account,auth_password,user_type,tenant_id,auth_code,Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With
Allow: POST,GET,OPTIONS
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: x-msg-timeout,X-Msg-Trace,csrfcheck,ShardingInfo,Partition,Date,Server

一看, 这个也很easy,通过python+requests库,获取到响应头,直接解析出来即可;这样能快速获取到大量的登录凭证;所以产生了如下代码:

# -*- coding: utf-8 -*-
import json

import requests
__author__ = "chenk"

class Interfaces:
    """接口请求类"""

    ANALYSIS_FC_PREFIX = "http://10.20.xx.xxx:xx/f"
    SERVICE_MALL_PREFIX = "http://10.20.xx.xxx:xx/"
    HEADERS = {"Content-Type": "application/json", 
                "Accept": "application/json"}

    def __init__(self):
        pass

    def request(self, url, data, is_get_method=True, verify=False, headers={}):
        # print("Will Reuqeuest Interface: {}".format(url))
        # print("Augues as follows: \n{}".format(data))
        if not headers:
            headers = Interfaces.HEADERS
        if is_get_method:
            r = requests.get(url=url, headers=headers, verify=verify, params=data)
        else:
            r = requests.post(url=url, headers=headers, verify=verify, params=data, data=data)
        result = r.headers
        # print("Response: \n{}".format(result))
        return result


import time
interfaces = Interfaces()
if __name__ == "__main__":
    url = "http://10.20.xx.xx:xxx/g/cultivate-user-service/v/appauth/login"
    data = {"mobile": "18255000000",
            "fund_account": "55000000",
            "cid": "55000000",
            "client_id": "55000000",
            }
    count = 1
    # count = 2
    start = 1
    run_time = 0
    # f = open(file=r"D:\jmeter\apache-jmeter-5.0\bin\token.txt", mode="w")
    while count:
        # data.update({"code": str(start+run_time)})
        result = interfaces.request(url=url, data=data, is_get_method=True)
        for k, v in result.items():
            print(k, v)
        # print(requests.utils.dict_from_cookiejar(result))
        count -= 1
        # run_time += 1
        # try:
        #     token = result.get("data").get("token")
        #     f.write(token + "\n")
        # except Exception as e:
        #     print(str(e))
        #     print("data:", data)
        #     print("result: ", result)
        #     continue
        # time.sleep(0.01)
    # f.close()
    print("done!")

执行结果中,发现所有响应头都返回了, 就是没有set-cookie这玩意,通过jmeter调用的时候,发现能够获取到, 故先不纠结python里面为啥获取不到,先保证手头工作要紧,毕竟打工人;
jmeter里面就两个地方需要注意:
1.响应头中的token获取
我这边用了一个后置处理器——正则提取器,提取设置如下:
正则提取
提取完毕后, 如何保存token值到一个文件里面?
2.保存提取的token数据
使用BeanShell Sampler, 编写一个简单类,代码如下:

FileWriter fstream = new FileWriter("E://token.csv", true);

BufferedWriter out = new BufferedWriter(fstream);

out.write( vars.get("get_token"));

out.write(System.getProperty("line.separator"));

out.close();

fstream.close(); 

FileWriter 创建了一个对象, 并指定文件存储路径为:E://token.csv;
jmeter中的变量可通过 vars.get(“变量名”)获取变量值;
System.getProperty(“line.separator”) 会在token写入后,换行,根据实际调整;
注意:上述代码会默认在尾部追加的形式写入文件;若不需要,可以直接删除文件直接生成,也可以更改代码中文件对象的写入方式;
最终程序执行完毕, 快速生成了一个存储了2万个token的文件,大工告成:
token

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值