Python接口自动化 -RESTful请求方法封装

对 Requests 库下一些常见的请求方法进行封装,调用起来更加方便。

先来看一个例子:

比如要测试登录接口

  1. 正常流测试(正确的账号、密码)
  2. 异常流测试(正确的账号,错误的密码等)
import requests

# 正常流
url = 'http://192.168.28.128:8080/recruit.students/login/in?account=admin&pwd=test123'
result = requests.get(url)
print(result.text)

# 异常流,密码错误
url = 'http://192.168.28.128:8080/recruit.students/login/in?account=admin&pwd=test'
result = requests.get(url)
print(result.text)

看上面这段代码,是不是显得比较冗余,我们每个请求里都要写一遍完整的 url。
还有就是当我们需要做一些连续调用的请求,比如“先登录再把商品加入购物车“,这样的时候,需要使用 requests 的 session 功能。

就要需要登录和登录后的请求都由同一个reqeusts session对象来发出。

# -*- coding:utf-8 -*-
import requests
import json as complexjson


class RestClient():
    def __init__(self, api_root_url):
        """
        :type api_root_url: 就是url的前缀,相当于host
        """
        self.api_root_url = api_root_url
        # 用session保持会话,相当于微型浏览器
        self.session = requests.session()

    def get(self, uri, **kwargs):
        """
        :type uri: 路径,每个接口的路径不一样,所以把路径抽离出来
        :type **kwargs: 关键字参数,它将不定长参数转换为 dict 传入函数
        """
        # 返回的时候调用这个类中的 request 方法
        return self.request(uri, "GET", **kwargs)

    def post(self, uri, data=None, json=None, **kwargs):
        return self.request(uri, "POST", data, json, **kwargs)

    def put(self, uri, data=None, **kwargs):
        return self.request(uri, "PUT", data, **kwargs)

    def delete(self, uri, **kwargs):
        return self.request(uri, "DELETE", **kwargs)

    def patch(self, uri, data=None, **kwargs):
        return self.request(uri, "PATCH", data, **kwargs)

    def request(self, uri, method, data=None, json=None, **kwargs):
        url = self.api_root_url + uri
        if method == "GET":
            return self.session.get(url, **kwargs)
        if method == "POST":
            return self.session.post(url, data, json, **kwargs)
        if method == "PUT":
            if json:
                # PUT 和 PATCH 中没有提供直接使用json参数的方法,因此需要用data来传入
                data = complexjson.dumps(json)
            return self.session.put(url, data, **kwargs)
        if method == "DELETE":
            return self.session.delete(url, **kwargs)
        if method == "PATCH":
            if json:
                data = complexjson.dumps(json)
            return self.session.patch(url, data, **kwargs)

这里,这个类里我加了一些方法,包括:

  1. init 方法:初始化这个类,初始化的时候需要输入 api_root_url,也就是URL的前缀host。另外还在初始化时创建了 self.session 用于保存 requests 的 session。

  2. get,post 等各种 http 方法,用于让用户使用。但这里并没有真正实现这些方法,因为这些方法都是在 requests 里有实现过,我们只要把参数传给 requests 就行了。这个传递我们写在 request 方法里,所以这里的 http 方法都是调用 requests 方法。

  3. request 方法:真正调用 self.session 的各种方法,这里同样是把参数传下去,只是在传之前,给所有用户输入的 url 加了一个前缀。前缀的值是用户在 init 方法里输入的。

使用封装好的方法进行登录操作:

r = RestClient("http://192.168.28.128:8080")

login = r.get(uri="/recruit.students/login/in",
              params={"account": "admin",
                       "pwd": "660B8D2D5359FF6F94F8D3345698F88C"
                       }
              )

只是要输入接口的 uri 和参数即可,不用再输入完整的 url。后续还可以对接口进行封装,接口封装完之后,测试的时候只需要输入接口入参就行。

-----分界线-------

王阳名说:知而不行,是为不知

读书、学习、看文章,总说自己知道,但不去做,其实就是不知道。说自己知道,可能只是为了好看。

学习第一个方法就是:重复

学一个知识,学 1 遍,没学会,继续学第 2 遍,第 3 遍,第 4 遍……,直到学会。

练一个技能,练 1 次,不会用,继续练 2 次,第 3 次,第 4 次……,直到会用。

书读百遍,其义自见。

posted @   西瓜_皮  阅读(921)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2018-03-02 (一)Fiddler的介绍和安装
2018-03-02 python-基本算法(冒泡)
2018-03-02 selenium - 截取页面图片和截取某个元素的图
点击右上角即可分享
微信分享提示