一、requests 库示例
- 安装 requests 库:pip install requests
import requests
"""python
1、接口的组成
- 请求方法:post、get、put、delete等
- url:ip+port+path
- 参数:body
- 请求头:headers
2、何时写函数?何时写类?
- 函数:一个功能处理一个逻辑,不需要后续关联
- 类:处理一个业务,例如:店铺业务中有查询、修改、新增接口,或者后续需要扩展的模块,例如店铺下有份店铺
"""
HOST = "http://192.168.0.128/api.php"
def login(in_data):
# url
url = f"{HOST}/user/login"
# 参数
payload = in_data
# 请求头(不一定需要)
headers = {}
# 发送请求
"""
3、请求的参数类型
data:默认是表单
json:json
params:get请求使用
files:文件上传
"""
resp = requests.post(url=url, data=payload)
print(resp.json())
if __name__ == '__main__':
login_payload = {"accounts": "test001", "pwd": "123456", "type": "username"}
login(login_payload)
二、requests 库请求的参数类型
| 请求参数 | 请求头中数据默认类型 | 描述 |
|---|---|---|
| data | Content-Type:application/x-www-form-urlencoded | 请求体是表单格式:a=1&b=2 |
| json | Content-Type:application/json | 请求体是 json 格式: |
| params | get 请求 | 参数在 url 上,如:http://192.168.0.128/api.php?a=1&b=2 |
| file | Content-Type:multipart/form-data | 文件上传接口中使用 |
三、requests 库请求相关信息与响应相关信息
- 例如发送请求:resp = requests.post(url=url, data=payload)
| 请求相关信息 | 响应相关信息 |
|---|---|
| resp.request.url | - |
| resp.request.hearders | resp.hearders |
| resp.request.body | resp.text |
四、requests 库响应消息四种格式
| 响应数据返回格式 | 说明 | 备注 |
|---|---|---|
| resp.text | 返回字符串类型 | 获取 html 响应数据/xml 格式响应 |
| resp.json() | 返回字典 | 响应数据必须是json字符串才可使用,得到的是字典 |
| resp.content | 返回字节类型 | 下载图片/文件时使用 |
| resp.raw | 返回原始 | 源数据 |
五、token 技术
- 图解 token:通过账号密码可以获取一个临时令牌(token),提供给后续作为身份校验

-
概念:令牌,一般在前后端分离的项目中使用,作为身份的校验
-
详情:服务后端程序产生的,存放到服务端,一般是缓存中(内存/磁盘),同时返回给客户端
-
时效性:多久过期有开发或者项目本身决定
-
redis使用场景:登录的 token 会存放到 redis
-
项目代码的处理:
-
一般通过登录接口请,成功之后,在响应数据中有 token 值
-
后续其他接口关联使用这个 token,一般放在后续接口的请求头里
-
-
示例:假如 token 值在响应中,可以通过字典取值、jsonpath取值、正则取值
# 下面为举例代码,并非可直接执行的代码
# 字典取值
resp = requests.post(url=url, data=payload)
print(resp.json()['token'])
# jsonpath取值,需要导入 jsonpath 库(需要自行安装:pip install jsonpath
)
import jsonpath
resp = requests.post(url=url, data=payload)
print(jsonpath.jsonpath(obj=resp.json(), expr='$..token'))
# 正则取值,需要导入 re 库
import re
resp = requests.post(url=url, data=payload)
pattern = re.compile('"token":(.*?),')
match = pattern.search(resp.text)
print(match.groups()[0])
# 或者
resp = requests.post(url=url, data=payload)
match = re.search(pattern='"code":(.*?),', string=resp.text)
print(match.groups()[0])
六、加密技术
-
在登录接口请求参数中看到的密码如果为加密的,是前端做的
-
常见的加密算法:
| MD5 | RSA | AES | SM4 | |
|---|---|---|---|---|
| 原理 | Hash 算法,32位数据 | 非对称加密 | 对称加密 | 国密:分组密码算法 |
| 分类 | MD5加密/盐值加密/双层盐值加密 | 公钥加密、私钥加密、私钥签名、公钥签名 | 加密密钥和解密密钥是一样的 | SM3/SM4 |
| 特点 | 简单的可以破解(库爆破) | 安全,但加密速度慢 | 加密速度快,但密钥丢失,就容易解密密文,安全性较差 | https://baike.baidu.com/item/SM4.0/3901780?fr=ge_ala |
1、MD5
- MD5 加密函数
import hashlib
# MD5 加密函数(加盐)
# 加盐例如:123456+盐值(字符串、数字、时间戳、随机数)
def get_md5_data(data: str, salt='') -> str:
"""
:param data: 被加密的数据
:param salt: 盐值,默认是空字符串
:return: 密文
"""
# 1、创建 md5 对象
md5 = hashlib.md5()
# 2、进行加密
data = f'{data}{salt}'
md5.update(data.encode('utf-8'))
# 3、返回加密后的密文
return md5.hexdigest()
print(get_md5_data("123456", ''))
- 改进上面登录接口使得密码进行了 MD5 加密
import requests
from utils.handle_encrypt import get_md5_data
HOST = "http://192.168.0.128/api.php"
def login(in_data):
# url
url = f"{HOST}/user/login"
# 入参
in_data['pwd'] = get_md5_data(in_data['pwd'])
payload = in_data
resp = requests.post(url=url, data=payload)
print(resp.json()['data']['token'])
if __name__ == '__main__':
login_payload = {"accounts": "test001", "pwd": "123456", "type": "username"}
login(login_payload)