对 Requests 库下一些常见的请求方法进行封装,调用起来更加方便。
先来看一个例子:
比如要测试登录接口
- 正常流测试(正确的账号、密码)
- 异常流测试(正确的账号,错误的密码等)
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)
这里,这个类里我加了一些方法,包括:
-
init 方法:初始化这个类,初始化的时候需要输入 api_root_url,也就是URL的前缀host。另外还在初始化时创建了 self.session 用于保存 requests 的 session。
-
get,post 等各种 http 方法,用于让用户使用。但这里并没有真正实现这些方法,因为这些方法都是在 requests 里有实现过,我们只要把参数传给 requests 就行了。这个传递我们写在 request 方法里,所以这里的 http 方法都是调用 requests 方法。
-
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 次……,直到会用。
书读百遍,其义自见。