接口测试平台代码实现112:登录态接口-8

简介: 本节我们要搞定普通接口调试时自动加入登陆态接口返回参数到请求头/体中的后台实现。

先来整理下我们目前已完成的材料:

普通接口,选择加登陆态:

微信图片_20220703212038.png

登陆态接口可以正常获取返回提取字段:

微信图片_20220703212051.png

然后我们去后台的views.py中找到调试普通接口的那个函数Api_send

首先,这个函数内容已经非常非常庞大了,现在我们要考虑怎么改:

  1. 获取前端这个登陆态加不加的开关的状态
  2. 如果关那么就没事,什么都不动
  3. 如果是开的,那么就要去调用登陆态接口请求,拿到返回提取字段回来插入到url,请求头和请求体里。
  4. url和请求头很好插入,但是请求体怎么办呢?请求体的种类好多,每种的的插入方法都不一样,甚至很麻烦。
    这里我就简单说下,可以插入也可以不插,插入的也只有row_json 和 form-data,x-www 三种。大多数接口的url中插入后,服务器就会认了。这和服务器具体代码有关。但是本文既然作为教程,所以就全会写,小伙伴别嫌麻烦,这工程量的确巨大。


先完成前三步:

微信图片_20220703212057.png

我们现在去看看登陆态接口的发送函数

project_login_send

这个函数目前,接收的是登陆态接口设置弹层前端给的请求参数。而我们现在直接调用,很显然我们是想让他用数据保存的请求参数来请求。

而且返回值也不能扔给前端了,而是正常返回给调用函数。所以虽然看起来差不多,但是还是再贴着写一个新的供调用的登陆态请求函数比较好,何况后期我们会对这个函数进行各种改造。

新建函数,完全复制,之后再改:

微信图片_20220703212104.png

然后给....for_other改成这样:

# 调用登陆态接口
def project_login_send_for_other(project_id):
    # 第一步,获取数据
    login_api= DB_login.objects.filter(project_id=project_id)[0]
    login_method = login_api.api_method
    login_url = login_api.api_url
    login_host = login_api.api_host
    login_header = login_api.api_header
    login_body_method = login_api.body_method
    login_api_body = login_api.api_body
    login_response_set = login_api.set
    # 第二步,发送请求
    try:
        header = json.loads(login_header) #处理header
    except:
        return HttpResponse('请求头不符合json格式!')
    # 拼接完整url
    if login_host[-1] == '/' and login_url[0] =='/': #都有/
        url = login_host[:-1] + login_url
    elif login_host[-1] != '/' and login_url[0] !='/': #都没有/
        url = login_host+ '/' + login_url
    else: #肯定有一个有/
        url = login_host + login_url
    try:
        if login_body_method == 'none':
            response = requests.request(login_method.upper(), url, headers=header, data={} )
        elif login_body_method == 'form-data':
            files = []
            payload = {}
            for i in eval(login_api_body):
                payload[i[0]] = i[1]
            response = requests.request(login_method.upper(), url, headers=header, data=payload, files=files )
        elif login_body_method == 'x-www-form-urlencoded':
            header['Content-Type'] = 'application/x-www-form-urlencoded'
            payload = {}
            for i in eval(login_api_body):
                payload[i[0]] = i[1]
            response = requests.request(login_method.upper(), url, headers=header, data=payload )
        elif login_body_method == 'GraphQL':
            header['Content-Type'] = 'application/json'
            query = login_api_body.split('*WQRF*')[0]
            graphql = login_api_body.split('*WQRF*')[1]
            try:
                eval(graphql)
            except:
                graphql = '{}'
            payload = '{"query":"%s","variables":%s}' % (query, graphql)
            response = requests.request(login_method.upper(), url, headers=header, data=payload )
        else: #这时肯定是raw的五个子选项:
            if login_body_method == 'Text':
                header['Content-Type'] = 'text/plain'
            if login_body_method == 'JavaScript':
                header['Content-Type'] = 'text/plain'
            if login_body_method == 'Json':
                header['Content-Type'] = 'text/plain'
            if login_body_method == 'Html':
                header['Content-Type'] = 'text/plain'
            if login_body_method == 'Xml':
                header['Content-Type'] = 'text/plain'
            response = requests.request(login_method.upper(), url, headers=header, data=login_api_body.encode('utf-8'))
        # 把返回值传递给前端页面
        response.encoding = "utf-8"
        DB_host.objects.update_or_create(host=login_host)
        res = response.json()
        # 第三步,对返回值进行提取
        get_res = {} #声明提取结果存放
        for i in login_response_set.split('\n'):
            if i == "":
                continue
            else:
                i = i.replace(' ','')
                key = i.split('=')[0] #拿出key
                path = i.split('=')[1]  #拿出路径
                value = res
                for j in path.split('/')[1:]:
                    value = value[j]
                get_res[key] = value
        return get_res
    except Exception as e:
        return {}

如图,修改的部分一是获取请求数据改成了从数据库拿,所以这个函数的入参改成了project_id,然后是最后结果返回,之前是一串字符串文案,现在是一个字典,出错就回空字典。


然后我们回到api_send函数中,调用这个新登陆态请求for_other函数:

微信图片_20220703212110.png

如图,我们发现了一个设计上的问题,就是请求函数并没有项目id,所以也不知道去调用哪个项目的登陆态了。

这里我们有俩种方式解决:

  1. 回到html中,给加上项目id
  2. 看到有api_id,那么根据api_id查到所属项目id,


这里为了简便,就用第二种方法了,完成如下:

微信图片_20220703212117.png

我们重启服务,来实际请求一下这个普通接口,看看能否输出得到的登陆态参数:

微信图片_20220703212123.png

可以看到,获取成功了~

那么接下来我们要给它插入到url 和 header里了:

首先是url,url要分为有没有?号,也就是有没有已经带了参数,没有带我们要手动加上?

微信图片_20220703212132.png

一定要注意上下文位置,这段代码的位置是放在拼接url之后,正式请求之前。

注意,这里插播一条缺陷修复,就是请求头为空时候 我们不再报错返回,而是当作无请求头进行:

微信图片_20220703212138.png

接下来我们请求一下看看url是否成功加入登陆态参数:

微信图片_20220703212147.png

可以看到,已经成功加上了。


然后是header:

header就更好办了:

微信图片_20220703212153.png

打印看看效果:

微信图片_20220703212158.png微信图片_20220703212204.png

可以看到,也成功加了进来了~

相关文章
|
25天前
|
Java 关系型数据库 数据库连接
Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
24 1
|
2月前
|
资源调度 测试技术 Linux
一款接口自动化神器—开源接口测试平台Lim(Less is More)
一款接口自动化神器—开源接口测试平台Lim(Less is More)
125 2
|
2月前
|
测试技术
包含用例执行时间的测试报告代码
包含用例执行时间的测试报告代码
|
4月前
com串口通信测试代码
com串口通信测试代码
26 0
|
28天前
|
缓存 运维 Serverless
应用研发平台EMAS产品常见问题之测试检查更新没有反应如何解决
应用研发平台EMAS(Enterprise Mobile Application Service)是阿里云提供的一个全栈移动应用开发平台,集成了应用开发、测试、部署、监控和运营服务;本合集旨在总结EMAS产品在应用开发和运维过程中的常见问题及解决方案,助力开发者和企业高效解决技术难题,加速移动应用的上线和稳定运行。
|
1月前
|
机器学习/深度学习 人工智能 监控
视觉智能平台常见问题之体验产品的美颜测试关掉如何解决
视觉智能平台是利用机器学习和图像处理技术,提供图像识别、视频分析等智能视觉服务的平台;本合集针对该平台在使用中遇到的常见问题进行了收集和解答,以帮助开发者和企业用户在整合和部署视觉智能解决方案时,能够更快地定位问题并找到有效的解决策略。
23 1
|
1月前
|
Java 测试技术
单元测试编写可测试代码
单元测试编写可测试代码
19 2
|
2月前
|
测试技术
Lim测试平台测试报告说明
Lim测试平台测试报告说明
32 2
|
2月前
|
SQL 测试技术 数据库连接
Lim接口测试平台-接口测试功能详解
Lim接口测试平台-接口测试功能详解
39 1
|
2月前
|
SQL 监控 测试技术
Lim测试平台变量使用规则介绍
Lim测试平台变量使用规则介绍
27 0