Requests 库进行 API 测试
Requests 库
Python requests 是一个常用的 HTTP 请求库,可以方便地向网站发送 HTTP 请求,并获取响应结果。可用于 API 测试框架。
一般情况下,在测试中使用最多的请求方式是 GET、POST、PUT、DELETE 这四种。
- GET
GET 方法请求一个指定资源的表示形式,使用 GET 的请求应该只被用于获取数据。
- POST
POST 方法用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用。
- PUT
PUT 方法用请求有效载荷替换目标资源的所有当前表示。
- DELETE
DELETE 方法删除指定的资源。
Requests 使用
发送 get 请求
import requests
if __name__ == '__main__':
# 发送get请求
equests.get('https://httpbin.org/ip')
在实际应用中,GET 接口请求常常要带参数 query string,而且有时候需要加 Header,鉴权(OAuth)甚至代理(Proxy),接口请求的例子如下:
import requests
if __name__ == '__main__':
# 发送get请求 --带参数
# 等同于直接访问https://httpbin.org/get?kevin=hello
requests.get('https://httpbin.org/get', params={'kevin': 'hello'})
# 当访问接口发生301跳转时,可以设置允许或者禁止跳转
requests.get('http://github.com/', allow_redirects=False)
# 发送get请求, 加proxy
proxies = {'http': 'http://10.10.1.10:3128',
'https': 'http://10.10.1.10:1080'}
requests.get('https://httpbin.org/get', proxies=proxies)
# 发送get请求,加鉴权 -- Basic Auth
# 首先导入HTTPBasicAuth,一般导入语句写在py文件的最前面。
from requests.auth import HTTPBasicAuth
requests.get('https://api.github.com/user', auth=HTTPBasicAuth('user', 'password'))
# 发送get请求,加鉴权 -- Digest Auth
# 首先导入HTTPDigestAuth,一般导入语句写在py文件的最前面。
from requests.auth import HTTPDigestAuth
requests.get('https://api.github.com/user', auth=HTTPDigestAuth('user', 'password'))
# OAuth 1 Authentication
# 首先安装requests_oauthlib (可通过pip install)
from requests_oauthlib import OAuth1
url = 'https://api.twitter.com/1.1/account/verify_credentials.json'
auth = OAuth1('YOUR_APP_KEY', 'YOUR_APP_SECRET', 'USER_OAUTH_TOKEN', 'USER_OAUTH_TOKEN_SECRET')
requests.get(url, auth=auth)
发送 post 请求
post 请求通常都会带数据 Payloads,当然也会需要 Header、OAuth,发送方式如下:
import requests
if __name__ == '__main__':
url = 'https://httpbin.org/anything'
headers = {'user-agent': 'my-app/ 0.0.1'}
payloads = {'iTesting': 'better to follow'}
auth = {"username":"iTesting", "password": "Kevin"}
# 直接post
r = requests.post(url, data=payloads)
# post带header
r = requests.post(url, headers=headers, data=payloads)
# post带鉴权, auth类型跟get请求支持的auth类型相同。
r = requests.post(url, headers=headers, data=payloads, auth=HTTPBasicAuth('user', 'password'))
发送 put 请求
import requests
if __name__ == '__main__':
# 直接发送put请求
# 如需要加header,auth,即参考post请求
r = requests.put('https://httpbin.org/put', data={'hello': 'iTesting'})
print(r.text)
发送 delete 请求
import requests
if __name__ == '__main__':
# 直接发送delete请求
r = requests.delete('https://httpbin.org/anything', data={'hello': 'iTesting'})
print(r.text)
获取接口返回值
接口的请求通常会有返回值,在接口测试中,特别是在顺序访问多个接口,并且前一个接口的返回是后一个接口的入参时,常常需要把接口返回的结果保持下来解析。
Requests 中提供了以下方式来保存接口返回值:
# -*- coding: utf-8 -*-
import requests
if __name__ == "__main__":
s = requests.session()
r = s.post('https://httpbin.org/anything', data={'hello': 'kevin'})
# 返回文本型response
print(r.text)
# #返回文本型response,并用utf-8格式编码
# # 当你用r.text得出的结果是不可读的内容例如包括类似xu'\xe1'或者有错误提示“'ascii' codec can't encode characters in position”时,可以用encode
print(r.text.encode('utf-8'))
# # 获取二进制返回值
print(r.content)
# # 获取请求返回码
print(r.status_code)
# 获取response的headers
print(r.headers)
# 获取请求返回的cookies
s.get('http://google.com')
print(request.cookies.get_dict())
Requests 保存 Session
HTTP 协议是无状态的协议,这也就导致每次接口请求都是独立的,也就意味着你的多个接口请求之间不能共用数据,比如登录态、cookie 等都是不能共用,这显然不符合我们的需求。
基于此,Requests 库提供了 Session 会话对象, 用来帮我们跨请求保持参数,使用 requests.Session() , 可以在一个 Session 实例的所有请求中保留 cookie,下面我们来看下 requests.Session() 的基本用法:
import requests
if __name__ == '__main__':
# 初始化一个session对象
s = requests.Session()
# 第一个get,先设置一个session
# httpbin这个网站允许我们通过如下方式设置,在set后写你需要的值即可
s.get('https://httpbin.org/cookies/set/sessioncookie/iTestingIsGood')
# 设置好后获取所有的cookies
r = s.get('https://httpbin.org/cookies')
# 打印,确定我们的cookies被保存了
print(r.text)
# 结果如下
# '{"cookies": {"sessioncookie": "iTestingIsGood"}}'
requests.Session() 的使用非常简单,首先你初始化一个 session 对象,接着你使用这个初始化后对象实例直接发起请求,在整个 session 内的所有请求之间是可以共享状态的。上个例子中我们就先初始化了 Session() 对象,假设是 s,然后通过 s.get() 方法去设置了一个 cookie,它的名字是 sessioncookie,它的值是 itestingIsGood。最后,我们去访问 cookies 接口,就拿到了我们刚设置的 cookie。通过 requests.Session() 的方式,我们就实现了 cookie 的保持。
一般在测试中,你可以通过直接请求登录接口便能拿到登录态,例如如下的形态:
import requests
if __name__ == '__main__':
s = requests.Session()
# 登录获取登录态
s.post(login_url, data=data, headers=headers, verify = False)
# 登录态获取后,请求登录后才能访问的接口,也能请求成功。
s.post('your-api')
为了更好地理解 requests.Session() 是如何保持登录态的,我们来看一个实际例子:
import requests
if __name__ == '__main__':
url = 'https://gate.lagou.com/v1/entry/message/newMessageList'
s = requests.Session()
r = s.get(url)
print(r.text)
# 结果如下:
# {"state": 1003, "message": "非法的访问"}
由于没有登录,访问结果是“非法的访问”。
可以通过人工登录的方式,然后 F12 从浏览器 console 查看 cookies 再进行访问。
# -*- coding: utf-8 -*-
import requests
if __name__ == "__main__":
url = 'https://gate.lagou.com/v1/entry/message/newMessageList'
cookie = {'cookie': '_gid=GA1.2.438589688.1601450871; gate_login_token=475844a837230240e1e73e4ecfa34102e65fa8e5384801cca67bbe983a142abb;'}
headers = {'x-l-req-header': '{deviceType: 9}'}
s = requests.Session()
# 直接带登录态发送请求
r = s.get(url, cookies=cookie, headers=headers)
# 不经过登录,也能访问登录后才能访问的接口
print(r.text.encode('utf-8'))
# {"state":1,"message":"成功","content":{"newMessageList":[],"newMessageCount":0}}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!