欢迎来到魔幻小生的博客

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}}
posted @   魔幻小生  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示