ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

测试平台系列(11) 封装Request类

2021-03-10 23:35:04  阅读:202  来源: 互联网

标签:11 code 封装 request self Request elapsed return response


封装Request类

回顾

上次我们完善了「登录注册」相关页面,还有「后端接口」,算是从0到1完成了一个功能的编码工作。可能前端部分会讲的比较粗糙,因为第一可能是笔者「造诣」不够,第二也跟我们直接从现有的「框架」进行改造有关,很多东西不是从0写到1,而是从11.1,但是后面不一样:

后面的页面都是咱们自己写,自己用,从0写到1

安装requests库

终端输入pip3 install requests并执行。

构思后端Request相关接口

要知道,咱们这是一个接口测试平台(后续可能会集成UI自动化,但是这个笔者也还没有想好)。一个接口自动化平台,最核心的当然是对api的「请求操作」,所以咱们刻不容缓,加快进度,趁热打铁,来点干货吧。用requests来协助我们完成接口自动化请求。

我们新建一个文件: middleware/HttpClient.py

import datetime

import requests


class Request(object):

    def __init__(self, url, session=False, **kwargs):
        self.url = url
        self.session = session
        self.kwargs = kwargs
        if self.session:
            self.client = requests.session()
            return
        self.client = requests

    def get(self):
        return self.request("GET")

    @staticmethod
    def get_elapsed(timer: datetime.timedelta):
        if timer.seconds > 0:
            return f"{timer.seconds}.{timer.microseconds // 1000}s"
        return f"{timer.microseconds // 100}ms"

    def request(self, method: str):
        status_code = 0
        elapsed = "-1ms"
        try:
            if method.upper() == "GET":
                response = self.client.get(self.url, **self.kwargs)
            elif method.upper() == 'POST':
                response = self.client.post(self.url, **self.kwargs)
            else:
                response = self.client.request(method, self.url, **self.kwargs)
            status_code = response.status_code
            if status_code != 200:
                return Request.response(False, status_code)
            elapsed = Request.get_elapsed(response.elapsed)
            data = response.json()
            return Request.response(True, 200, data, response.headers, response.request.headers, elapsed=elapsed)
        except Exception as e:
            return Request.response(False, status_code, msg=str(e), elapsed=elapsed)

    def post(self):
        return self.request("POST")

    @staticmethod
    def response(status, status_code=200, response=None, response_header=None,
                 request_header=None, elapsed=None, msg="success"):
        request_header = {k: v for k, v in request_header.items()}
        response_header = {k: v for k, v in response_header.items()}
        return {
            "status": status, "response": response, "status_code": status_code,
            "response_header": response_header, "request_header": request_header,
            "msg": msg, "elapsed": elapsed,
        }

如果我是产品经理的话,那么postman就是我的原型图:

讲解一下各个方法,首先这是一个Request请求类,他拥有核心方法: request,目前咱们暂时先只做到支持json类的请求,后续补全form, file等类型的请求。

其实这个类做的事情很简单,就是把requests相关的方法剥离了出来,封装了一层。

其中「构造函数」提供了一些选项,包括请求的信息,url,是否以session的方式请求等等,kwargs涵盖了requests原生的参数,只要你想传,你都可以传进来。

get_elapsed是根据postman为参照,对请求时间做的一个处理,如果大于1s的请求响应时间,那我们以为单位显示,否则以毫秒为单位显示。

response是构造返回结构对象,对本次请求的数据进行整理。

request就封装了requests库的核心操作,基本上属于原生处理,并且判断了http状态码。

编写request接口

新建controllers/request/http.py

from flask import Blueprint
from flask import jsonify
from flask import request

from app.middleware.HttpClient import Request

req = Blueprint("request", __name__, url_prefix="/request")


@req.route("/http", methods=['POST'])
def http_request():
    data = request.get_json()
    method = data.get("method")
    if not method:
        return jsonify(dict(code=101, msg="请求方式不能为空"))
    url = data.get("url")
    if not url:
        return jsonify(dict(code=101, msg="请求地址不能为空"))
    body = data.get("body")
    headers = data.get("headers")
    r = Request(url, data=body, headers=headers)
    response = r.request(method)
    return jsonify(dict(code=0, data=response, msg="操作成功"))

其实和登录/注册接口都很相似,基本上就是创立了一个blueprint,前缀是/request,后续就是引入刚才的request类,进行http请求,最后返回response。

调整run.py

我们新建了一个蓝图,需要去run.py进行注册:

2行代码搞定
2行代码搞定
from app.controllers.request.http import req
pity.register_blueprint(req)
最终的效果如图所示
最终的效果如图所示

本节内容就到这里了,下一节咱们编写属于自己的第一个组件: postman。又是前端内容了,咱们做一个接近postman的页面即可,不需要多高大上,做东西要抓住用户的使用习惯。毕竟咱们不是

标签:11,code,封装,request,self,Request,elapsed,return,response
来源: https://www.cnblogs.com/we8fans/p/14515044.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有