接口测试平台代码实现109:登录态接口-5

简介: 我们本节来制作登陆态接口的请求js函数,为什么要制作这个调试请求功能?这个功能在正常使用中是不会用到的,这里只用来给调试用,也就是测试。

确保这个登陆态接口是能够正常请求返回并成功提取 需要用到的参数的。

之后普通接口自动添加登陆态的时候,走的其实是另一套类似的新函数。


打开P_apis.html,给Send按钮加上onclick并且下面新建login_send函数:

微信图片_20220703195314.png

具体的代码呢,和普通接口调试层类似,复制过来改改即可,当然我仍然会先改好,再贴可复制的代码:

unction login_send() {
    // 获取接口的所有数据
    var login_method = document.getElementById('login_method').value ;
    var login_url = document.getElementById('login_url').value ;
    var login_host = document.getElementById('login_host').value ;
    var login_header = document.getElementById('login_header').value ;
    var login_response_set = document.getElementById('login_response_set').value;
     // 判断顶部的数据是否填充完
    if(login_method == 'none'){alert('请选择请求方式!');return}
    if(login_url == ''){alert('请输入url!');return}
    if(login_host == ''){alert('请输入host!');return}
     //判断关键数据是否符合规则
    if(login_host.slice(0,7) != 'http://' && login_host.slice(0,8) != 'https://' && login_host.slice(0,4) !='全局域名'){
        alert('host必须以http://或https://开头!');return
    }
    if(login_header != ''){
        try {
            JSON.parse(login_header)
        }catch (e) {
            alert('header请求头不符合json规范!');
            return
        }
    }
    var login_body_method = $('ul#login_myTab li[class="active"]')[0].innerText;
    if(login_body_method == '返回体'){
            alert('请切换到请求体tab再保存!');
            return
        }
    if(login_body_method == 'none'){
        var login_api_body = ''
    }
    if(login_body_method == 'form-data'){
        var login_api_body = []; //新建这个空列表用来存放后续的数据
        var tbody_ = $("table#login_mytable tbody")[0]; //获取该表格的内容部分
        var trlist = tbody_.children ; //获取下面所有tr,每个tr就是一个键值对实际上
        for(var i=0;i<trlist.length;i++) {
            var tdarr = trlist[i].children; // 获取tr下的俩个td
            var key = tdarr[0].innerText; // 获取key
            var value = tdarr[1].innerText; // 获取value
            login_api_body.push([key, value]);// 作为一个数组,存放到这个大数组里。
        }
        login_api_body = JSON.stringify(login_api_body);
    }
    if(login_body_method == 'x-www-form-urlencoded'){
        var login_api_body = []; //新建这个空列表用来存放后续的数据
        var tbody_ = $("table#login_mytable2 tbody")[0]; //获取该表格的内容部分
        var trlist = tbody_.children ; //获取下面所有tr,每个tr就是一个键值对实际上
        for(var i=0;i<trlist.length;i++) {
            var tdarr = trlist[i].children; // 获取tr下的俩个td
            var key = tdarr[0].innerText; // 获取key
            var value = tdarr[1].innerText; // 获取value
            login_api_body.push([key, value]);// 作为一个数组,存放到这个大数组里。
        }
        login_api_body = JSON.stringify(login_api_body);
    }
    if(login_body_method == 'Text'){
        var login_api_body = document.getElementById('login_raw_Text').value;
    }
    if(login_body_method == 'JavaScript'){
        var login_api_body = document.getElementById('login_raw_JavaScript').value;
    }
    if(login_body_method == 'Json'){
        var login_api_body = document.getElementById('login_raw_Json').value;
    }
    if(login_body_method == 'Html'){
        var login_api_body = document.getElementById('login_raw_Html').value;
    }
    if(login_body_method == 'Xml'){
        var login_api_body = document.getElementById('login_raw_Xml').value;
    }
    if(login_body_method == 'GraphQL'){
        body_plan_G_Q = document.getElementById('login_body_plan_G_Q').value;
        body_plan_G_G = document.getElementById('login_body_plan_G_G').value;
         var login_api_body = body_plan_G_Q+ '*WQRF*' + body_plan_G_G
    }
     $.get('/project_login_send/',{
        'login_method':login_method,
        'login_url':login_url,
        'login_host':login_host,
        'login_header':login_header,
        'login_body_method':login_body_method,
        'login_api_body':login_api_body,
        'login_response_set':login_response_set,
    },function (ret) {
        $("li a[href=#login_response]").click(); //点击一下返回体按钮
        document.getElementById('login_response_body').value = ret ;//把返回值显示到返回值多行文本框中
    })
}

代码中注意,增加了返回值提取设置字段:login_response_set

然后我们去urls.py中进行设置:

微信图片_20220703195321.png

然后去views.py中进行写好这个比较复杂的方法吧~

微信图片_20220703195327.png

我们现在来思考下,这个方法要做什么事?

  1. 获取前端的数据
  2. 进行请求,得到返回值
  3. 对返回值进行提取
  4. 把提取的结果和返回值一起返回给前端来展示


好现在开始写,由于代码量太大,并且大部分是复制首页发送请求的代码改改,所以大家依然可以复制:

# 调试登陆态接口
def project_login_send(request):
    # 第一步,获取前端数据
    login_method = request.GET['login_method']
    login_url = request.GET['login_url']
    login_host = request.GET['login_host']
    login_header = request.GET['login_header']
    login_body_method = request.GET['login_body_method']
    login_api_body = request.GET['login_api_body']
    login_response_set = request.GET['login_response_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 +'"\n'
        # 第四步,返回前端
        end_res = {"response":response.text,"get_res":get_res}
        return HttpResponse(json.dumps(end_res),content_type='application/json')
    except Exception as e:
        end_res = {"response":str(e),"get_res":''}
        return HttpResponse(json.dumps(end_res),content_type='application/json')

注意,上面的最后 我用了一个字典装好数据返回给前端了。前端要进行对应解析。所以回到P_apis.html中,这个js函数的返回处理部分 改成了如下红线格式即可。微信图片_20220703195334.png

相关文章
|
2月前
|
Java 关系型数据库 数据库连接
Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
35 1
|
15天前
|
jenkins Devops 测试技术
单元测试与质量保证:确保Visual Basic代码的健壮性
【4月更文挑战第27天】在VB开发中,单元测试是保证代码质量和软件健壮性的关键。本文介绍了单元测试的基础,包括其定义和好处,如提高代码质量、促进重构。接着,讨论了MSTest、NUnit和xUnit等VB单元测试工具。遵循TDD原则和最佳实践,编写独立、有针对性的测试,并注重测试速度和覆盖率。通过示例展示了如何在Visual Studio中设置和运行测试。最后,提到了持续集成和自动化测试工具,如Jenkins和静态代码分析工具,以提升软件开发效率和质量。单元测试不仅是技术手段,更是提升团队协作和软件工程水平的文化体现。
|
1天前
|
数据挖掘 测试技术 网络安全
LabVIEW开发卫星测试平台
LabVIEW开发卫星测试平台
|
1天前
|
程序员 测试技术
程序员难以一次性写好代码并持续修复Bug,主要源于软件的高复杂性、需求不确定性、测试局限性和技术能力限制。
程序员难以一次性写好代码并持续修复Bug,主要源于软件的高复杂性、需求不确定性、测试局限性和技术能力限制。复杂的系统易产生意外问题,需求变化导致初始设计难完备,测试无法覆盖所有情况,而技术更新和个体能力差异也会引入错误。因此,持续调试和优化是保证软件质量的关键步骤。
5 0
|
1天前
|
算法 物联网 5G
LabVIEW开发最小化5G系统测试平台
LabVIEW开发最小化5G系统测试平台
|
1天前
|
算法 数据可视化 API
LabVIEWCompactRIO 开发指南33 测试和调试LabVIEW FPGA代码
LabVIEWCompactRIO 开发指南33 测试和调试LabVIEW FPGA代码
|
3天前
|
消息中间件 测试技术 Linux
linux实时操作系统xenomai x86平台基准测试(benchmark)
本文是关于Xenomai实时操作系统的基准测试,旨在评估其在低端x86平台上的性能。测试模仿了VxWorks的方法,关注CPU结构、指令集等因素对系统服务耗时的影响。测试项目包括信号量、互斥量、消息队列、任务切换等,通过比较操作前后的时戳来测量耗时,并排除中断和上下文切换的干扰。测试结果显示了各项操作的最小、平均和最大耗时,为程序优化提供参考。注意,所有数据基于特定硬件环境,测试用例使用Alchemy API编写。
10 0
linux实时操作系统xenomai x86平台基准测试(benchmark)
|
3天前
|
传感器 Linux 测试技术
xenomai 在X86平台下中断响应时间测试
该文讨论了实时操作系统中断响应时间的重要性,并介绍了x86中断机制和Xenomai的中断管理,包括硬件中断和虚拟中断的处理。Xenomai通过I-Pipe确保实时性,中断优先级高的Xenomai先处理中断。文中还提到了中断响应时间的测试设计,分别针对I-Pipe内核间虚拟中断和硬件中断进行了测试,并给出了在不同负载下的测试结果。
8 0
xenomai 在X86平台下中断响应时间测试
|
8天前
|
测试技术
使用CLion创建Cmake项目,使用GoogleTest和GoogleMock对代码进行测试
使用CLion创建Cmake项目,使用GoogleTest和GoogleMock对代码进行测试
20 3
|
11天前
|
Linux 测试技术 数据安全/隐私保护
CentOS安装MeterSphere并实现无公网IP远程访问本地测试平台
CentOS安装MeterSphere并实现无公网IP远程访问本地测试平台

热门文章

最新文章