文章目录
- 2.接口自动化测试
-
- [2.3 第一个简单的接口自动化](#2.3 第一个简单的接口自动化)
- [2.4 requests模块](#2.4 requests模块)
-
- [2.4.1 安装](#2.4.1 安装)
- [2.4.2 介绍](#2.4.2 介绍)
- [2.4.3 常见请求方法](#2.4.3 常见请求方法)
- [2.4.4 添加请求信息](#2.4.4 添加请求信息)
-
- [1. 发送GET请求(带查询参数)](#1. 发送GET请求(带查询参数))
- [2. 发送POST请求(表单数据)](#2. 发送POST请求(表单数据))
- [3. 发送POST请求(JSON数据)](#3. 发送POST请求(JSON数据))
- [4. 文件上传](#4. 文件上传)
- [5. 携带Cookies](#5. 携带Cookies)
- [6. 使用代理](#6. 使用代理)
- [7. 基本认证](#7. 基本认证)
- [8. SSL证书验证](#8. SSL证书验证)
- [9. 超时设置](#9. 超时设置)
- [10. 自定义Headers](#10. 自定义Headers)
- [11.添加 cookie 信息](#11.添加 cookie 信息)
2.接口自动化测试
2.3 第一个简单的接口自动化
示例:对百度接口发起请求
python
import requests
r = requests.get("https://www.baidu.com")
print(r)
返回值:

也有可能
requests下面出现红色波浪线,提示没有安装requests模块,这个时候可以点击终端来查询到底有没有这个。没安装也没啥,下一步安装。
安装了的最好也照做一下,省的版本不同导致问题发生。

2.4 requests模块
2.4.1 安装
命令行通过pip工具进行安装,命令:
python
pip install requests==2.31.0
安装成功示例:

检查当前项目下包是否更新:
输入pip list来检查到底有没有更新版本:

2.4.2 介绍
requests库是一个非常流行的HTTP客户端库,用于发送HTTP请求。requests.get方法用于发送一个HTTP get请求到指定的URL
requests.get方法返回一个Response对象,这个对象包含了服务器返回的所有信息。如:

Response 对象提供的属性/方法介绍:
| 属性/方法 | 描述 |
|---|---|
r.status_code |
响应状态码 |
r.content |
字节方式的响应体,会自动解码gzip和deflate压缩 |
r.headers |
以字典对象存储服务器响应头,若键不存在则返回None |
r.json() Requests |
中内置的JSON解析方法,将响应体解析为JSON格式 (如果响应结果为JSON格式,必须以JSON打印) |
r.url |
获取实际请求的URL |
r.encoding |
编码格式,根据响应头部的字符编码确定 |
r.cookies |
获取服务器设置的cookies |
r.raw |
返回原始响应体,不进行任何处理 |
r.text |
字符串方式的响应体,会自动根据响应头部的字符编码进行解码 (如果响应结果为HTML格式,必须以test打印,否则代码报错) |
r.raise_for_status() |
失败请求(非200响应)抛出异常 |
例子:
代码:
python
import requests
r = requests.get("https://www.baidu.com")
# 状态码
# print(r.status_code)
# 响应体
print(r.text)
# 打印响应头
print(r.headers)
打印:
python
"D:\Program Files\Python39\python.exe" D:/code/python/接口自动化测试/apiAutotest01/test1.py
<html>
<head>
<script>
location.replace(location.href.replace("https://","http://"));
</script>
</head>
<body>
<noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>
</body>
</html>
{'Accept-Ranges': 'bytes', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'Content-Length': '227', 'Content-Security-Policy': "frame-ancestors 'self' https://chat.baidu.com http://mirror-chat.baidu.com https://fj-chat.baidu.com https://hba-chat.baidu.com https://hbe-chat.baidu.com https://njjs-chat.baidu.com https://nj-chat.baidu.com https://hna-chat.baidu.com https://hnb-chat.baidu.com http://debug.baidu-int.com https://sai.baidu.com https://mcpstore.baidu.com https://mcpserver.baidu.com https://www.mcpworld.com https://platform-openai.now.baidu.com;", 'Content-Type': 'text/html', 'Date': 'Mon, 08 Dec 2025 14:26:31 GMT', 'Pragma': 'no-cache', 'Server': 'BWS/1.1', 'Set-Cookie': 'BD_NOT_HTTPS=1; path=/; Max-Age=300, PSTM=1765203991; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, H_PS_PSSID=60275_63145_66232_66242_66285_66258_66393_66510_66515_66529_66559_66584_66591_66601_66647_66663_66670_66689_66743_66618_66756_66775_66782_66790_66829_66854_66599; path=/; expires=Tue, 08-Dec-26 14:26:31 GMT; domain=.baidu.com, BAIDUID=3D3ADC3C9DAB8339B5E073C394C0D114:FG=1; Path=/; Domain=baidu.com; Max-Age=31536000, BAIDUID_BFESS=3D3ADC3C9DAB8339B5E073C394C0D114:FG=1; Path=/; Domain=baidu.com; Max-Age=31536000; Secure; SameSite=None', 'Traceid': '1765203991162334055412487297369341595359', 'X-Ua-Compatible': 'IE=Edge,chrome=1', 'X-Xss-Protection': '1;mode=block'}
进程已结束,退出代码0
我们把打印的响应头调整一下格式:
python
{
'Accept-Ranges': 'bytes',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Content-Length': '227',
'Content-Security-Policy': "frame-ancestors 'self' https://chat.baidu.com http://mirror-chat.baidu.com https://fj-chat.baidu.com https://hba-chat.baidu.com https://hbe-chat.baidu.com https://njjs-chat.baidu.com https://nj-chat.baidu.com https://hna-chat.baidu.com https://hnb-chat.baidu.com http://debug.baidu-int.com https://sai.baidu.com https://mcpstore.baidu.com https://mcpserver.baidu.com https://www.mcpworld.com https://platform-openai.now.baidu.com",
'Content-Type': 'text/html',
'Date': 'Mon, 08 Dec 2025 14:26:31 GMT',
'Pragma': 'no-cache',
'Server': 'BWS/1.1',
'Set-Cookie': 'BD_NOT_HTTPS=1; path=/; Max-Age=300, PSTM=1765203991; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, H_PS_PSSID=60275_63145_66232_66242_66285_66258_66393_66510_66515_66529_66559_66584_66591_66601_66647_66663_66670_66689_66743_66618_66756_66775_66782_66790_66829_66854_66599; path=/; expires=Tue, 08-Dec-26 14:26:31 GMT; domain=.baidu.com, BAIDUID=3D3ADC3C9DAB8339B5E073C394C0D114:FG=1; Path=/; Domain=baidu.com; Max-Age=31536000, BAIDUID_BFESS=3D3ADC3C9DAB8339B5E073C394C0D114:FG=1; Path=/; Domain=baidu.com; Max-Age=31536000; Secure; SameSite=None',
'Traceid': '1765203991162334055412487297369341595359',
'X-Ua-Compatible': 'IE=Edge,chrome=1',
'X-Xss-Protection': '1;mode=block'
}
然后我们打开百度查看:


可以发现响应头里面基本都是有的。
2.4.3 常见请求方法
python
#发起get请求
def get(url, params=None, **kwargs)
#发起post请求
def post(url, data=None, json=None, **kwargs)
#支持不同请求方式,method:指定请求方法,
#支持`get`, `OPTIONS`, `HEAD`, `post`, `PUT`, `PATCH`, or `DELETE`
def request(method, url, **kwargs)
---------------------------------------------------
# **kwargs:其他请求参数(如headers、timeout等)
使用示例:
python
import requests
get_r = requests.get("https://www.baidu.com")
post_r = requests.post("https://www.baidu.com")
req_r1 = requests.request(method="get", url="https://www.baidu.com")
req_r2 = requests.request(method="post", url="https://www.baidu.com")
print("get:", get_r.status_code)
print("post:", post_r.status_code)
print("method_get:", req_r1.status_code)
print("method_post:", req_r2.status_code)
打印:

当然我们也可以通过Postman来简单查看一下接口参数:


2.4.4 添加请求信息
get() 、 post() 底层都是调用 request() 方法,因此这三个方法在发送请求时,传参无太大区别,可传递的参数展示如下:
| 参数名 | 描述 |
|---|---|
url |
请求的接口 |
headers |
一个字典,包含要发送的HTTP头。 |
cookies |
一个字典、列表或者 RequestsCookieJar 对象,包含要发送的cookies。 |
files |
一个字典,包含要上传的文件。 |
data |
一个字典、列表或者字节串,包含要发送的请求体数据。 |
json |
一个字典,将被转换为JSON格式并发送。 |
params |
一个字典、列表或者字节串,将作为查询字符串附加到URL上。 |
auth |
一个元组,包含用户名和密码,用于HTTP认证。 |
timeout |
一个浮点数或元组,指定请求的超时时间。 |
proxies |
一个字典,包含代理服务器的信息。 |
verify |
一个布尔值或字符串,指定是否验证SSL证书。 |
1. 发送GET请求(带查询参数)
python
import requests
# 定义查询参数
params = {'page': 1, 'limit': 20}
# 发送GET请求
response = requests.get(
url='https://api.example.com/data',
params=params,
headers={'Authorization': 'Bearer token123'},
timeout=5
)
print(response.json()) # 解析JSON响应
说明 :params将字典转换为URL查询字符串(如?page=1&limit=20),headers添加认证头,timeout设置请求超时时间。
python
#带有参数
url = "http://8.137.19.140:9090/blog/getBlogDetail?blogId=15686"
#定义请求头
header = { "User_token_header":"eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlck5hbWUiOiJ6aGFuZ3NhbiIsImV4cCI6MTc0MDAyNTE2MX0.vbujuCAUkChZVWFmXiH4w4T1_DFv7C_g_hMtx873v_A"
}
r = requests.request(method="GET",url=url,headers=header) # 这里没有params=param,因为url里面有
print(r.json())
python
#这里的get请求,url上拼接的参数也可以单独拿下来写
url = "http://8.137.19.140:9090/blog/getBlogDetail"
param = {
"blogId":15686
}
#定义请求头
header = { "User_token_header":"eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlck5hbWUiOiJ6aGFuZ3NhbiIsImV4cCI6MTc0MDAyNTE2MX0.vbujuCAUkChZVWFmXiH4w4T1_DFv7C_g_hMtx873v_A"
}
r = requests.request(method="GET",url=url,params=param,headers=header)
print(r.json())
2. 发送POST请求(表单数据)
python
import requests
# 表单数据
data = {'username': 'admin', 'password': '123456'}
# 发送POST请求
response = requests.post(
url='https://api.example.com/login',
data=data
)
print(response.text)
说明 :data参数自动将字典编码为表单格式(application/x-www-form-urlencoded)。
3. 发送POST请求(JSON数据)
python
import requests
# JSON数据
json_data = {'name': 'John', 'age': 30}
# 发送POST请求
response = requests.post(
url='https://api.example.com/users',
json=json_data,
headers={'Content-Type': 'application/json'}
)
print(response.json())
说明 :json参数自动序列化为JSON字符串,并设置Content-Type为application/json。
4. 文件上传
python
import requests
# 上传文件
files = {'file': open('report.pdf', 'rb')}
# 发送POST请求
response = requests.post(
url='https://api.example.com/upload',
files=files
)
print(response.text)
说明 :files参数支持多部分表单上传,适用于文件传输。
5. 携带Cookies
python
import requests
# Cookies字典
cookies = {'session_id': '12345'}
# 发送GET请求
response = requests.get(
url='https://api.example.com/profile',
cookies=cookies
)
print(response.text)
说明 :cookies参数自动在请求中添加Cookie头。
6. 使用代理
python
import requests
# 代理服务器配置
proxies = {
'http': 'http://proxy.example.com:8080',
'https': 'https://proxy.example.com:8080'
}
# 发送GET请求
response = requests.get(
url='https://api.example.com/data',
proxies=proxies
)
print(response.text)
说明 :proxies参数指定HTTP/HTTPS代理服务器。
7. 基本认证
python
import requests
# 用户名和密码
auth = ('username', 'password')
# 发送GET请求
response = requests.get(
url='https://api.example.com/protected',
auth=auth
)
print(response.text)
说明 :auth参数自动添加Authorization头(Basic Auth)。
8. SSL证书验证
python
import requests
# 禁用SSL验证(不推荐用于生产环境)
response = requests.get(
url='https://api.example.com',
verify=False # 跳过SSL证书验证
)
print(response.text)
说明 :verify=False用于测试环境,生产环境应提供CA证书路径(如verify='/path/to/cert.pem')。
9. 超时设置
python
import requests
# 设置超时(连接超时5秒,读取超时10秒)
response = requests.get(
url='https://api.example.com',
timeout=(5, 10)
)
print(response.text)
说明 :timeout可以是浮点数(总超时)或元组(连接超时,读取超时)。
10. 自定义Headers
python
import requests
# 自定义请求头
headers = {
'User-Agent': 'MyApp/1.0',
'Accept-Language': 'en-US'
}
# 发送GET请求
response = requests.get(
url='https://api.example.com',
headers=headers
)
print(response.text)
说明 :headers参数覆盖默认请求头,常用于模拟浏览器或设置API密钥。
11.添加 cookie 信息
python
#添加用户登录凭证--cookie(.Cnblogs.AspNetCore.Cookies)
url = "https://account.cnblogs.com/user/userinfo"
cookie = {
".Cnblogs.AspNetCore.Cookies":"CfDJ8KL9kPW-LSFBi_9YdTzcC08XCItelbe4irfXxh-_hmXnNBYIpKioLVHPniZ2Cx5_Y1UtiUo_6eNEdT3wppoRwqpaV_fXKi7mJzn12_u9YMEr_2IyNRAzZ4ulRWtylki3GHehwaRdnzwbcK2-iWsmNw9nz8FPnaBCApdQDS9FR8T4ddhO23pVl2H2_21tA5Rexfqg1GqdIhsqVQW0-tTIuKIMQFVXWkO6Ym2OMGeZpjZxS78aHInaPzdG5CXNSAlauBD2YgjQ85dw9XOr3BPhwALoSR0K0eLrbEu1IvAETwmwqu3SlQmdohLgOl5AzDYmdpTpXkoKR4AOTyrm0Ve2QZM8ikMBY4qRL-n3yAxu1psc-gfoF842tshikHpHrPlTK_oLnIIqnvlrMQ-f53lhGdwiirXmCLS6BaphK88n8VSc4l2s9vU6SZbfqEzp3-GmWLFoOpFne1CUldXJcB949pfUH_eRFiFt9oGI5-U52yJwjc3Pn_qEFspG_XxjHKuBW2SI01T3AtBTDEOi4bZNuwYw3QU2W7rK7KFlhI0TWo9mzGBxOP0Fpix6EqRORJYVPU7oNttBNicK_y2IMLJSu5w;"
}
r = requests.request(method="GET",url=url,cookies=cookie)
print(r.text)
问题:上传参数选择
params、json还是data?
params用于在URL中传递查询参数(Query Parameters),通常用于GET请求,但也可以用于其他类型的请求。json用于在请求体(Body)中传递JSON格式的数据,通常用于POST或PUT请求。data用于在请求体(Body)中传递表单数据,通常用于POST或PUT请求。
若参数上传格式选择为json格式,Content-Type会自动被设置为application/json
有了requests库,可以实现对接口发起http请求,然而自动化测试中,我们需要编写大量的测试用例,这些用例的组织、执行和管理也需要使用其他更强大的框架------pytest框架。
requests库专注于HTTP请求的发送,而pytest框架则提供了测试的组织、执行和管理功能。