前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >接口测试平台代码实现112:登录态接口-8

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

作者头像
我去热饭
发布2022-05-19 09:40:08
3990
发布2022-05-19 09:40:08
举报
文章被收录于专栏:测试开发干货

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

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

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

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

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

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

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

先完成前三步:

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

代码语言:javascript
复制
project_login_send

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

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

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

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

代码语言:javascript
复制
# 调用登陆态接口
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函数:

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

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

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

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

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

可以看到,获取成功了~

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

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

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

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

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

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

然后是header:

header就更好办了:

打印看看效果:

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

今天的内容到此结束。下节课我们完成 加入到各种类型的请求体中。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试开发干货 微信公众号,前往查看

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

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

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