Python POST请求案例:如何提交数据?一篇搞定所有场景
目录导读
- 为什么你需要掌握Python POST请求?
- POST请求基础:从安装到第一个请求
- 实战案例一:提交表单数据(application/x-www-form-urlencoded)
- 实战案例二:提交JSON数据(application/json)
- 实战案例三:上传文件(multipart/form-data)
- 常见错误与调试技巧
- 问答环节:你关心的POST请求问题
- 总结与最佳实践
为什么你需要掌握Python POST请求?
在Web开发、数据采集、API对接等场景中,POST请求是提交数据到服务器的核心方式,与GET不同,POST可以携带大量数据且更安全(数据在请求体中而非URL)。

- 用户注册时提交用户名和密码
- 上传文件到云存储
- 调用ChatGPT API发送对话内容
Python凭借其简洁的语法和强大的requests库,成为了处理HTTP请求的首选工具,本篇文章将用三个真实案例,手把手教你用Python提交各种格式的数据。
POST请求基础:从安装到第一个请求
1 安装requests库
pip install requests
2 一个最简单的POST请求
import requests
url = "https://httpbin.org/post"
data = {"key": "value"} # 表单数据
response = requests.post(url, data=data)
print(response.status_code) # 200
print(response.json()) # 查看服务器返回的请求详情
说明:
httpbin.org/post是一个测试服务,它会原样返回你提交的数据,非常适合调试。
实战案例一:提交表单数据(application/x-www-form-urlencoded)
这是最常见的POST场景,例如提交登录表单。
场景:模拟登录一个测试网站
import requests
login_url = "https://httpbin.org/post"
payload = {
"username": "admin",
"password": "123456",
"remember": "on"
}
# 默认data参数会自动设置Content-Type: application/x-www-form-urlencoded
response = requests.post(login_url, data=payload)
# 解析返回的JSON
result = response.json()
print("提交的表单数据:", result["form"]) # 输出:{'username': 'admin', ...}
关键点:
data参数接收字典,requests会自动编码为key1=value1&key2=value2格式。- 如果数据中有特殊字符(如中文),无需手动编码,requests会自动处理。
实战案例二:提交JSON数据(application/json)
现代RESTful API(如OpenAI、GitHub)普遍要求JSON格式。
场景:调用一个测试API发送JSON
import requests
import json
api_url = "https://httpbin.org/post"
json_data = {
"user": {"name": "张三", "age": 28},
"items": ["book", "pen"],
"active": True
}
# 方法一:使用json参数(推荐)
response = requests.post(api_url, json=json_data)
# 方法二:手动设置headers和data(等价)
# headers = {"Content-Type": "application/json"}
# response = requests.post(api_url, data=json.dumps(json_data), headers=headers)
print(response.json()["json"]) # 输出你提交的JSON
关键点:
json参数会自动设置Content-Type: application/json并序列化数据。- 如果你需要传递嵌套字典或列表,JSON是最佳选择。
- 对于非ASCII字符(如中文),requests默认会转义(如
\u5f20),若想保留中文,可设置:response = requests.post(api_url, json=json_data, headers={"Accept": "application/json"})
实战案例三:上传文件(multipart/form-data)
当提交包含文件的表单时,必须使用multipart/form-data类型。
场景:上传一个文本文件和一个图片
import requests
upload_url = "https://httpbin.org/post"
# 准备文件
files = {
"file1": ("report.txt", open("report.txt", "rb"), "text/plain"),
"file2": ("photo.jpg", open("photo.jpg", "rb"), "image/jpeg"),
# 也可以附加普通字段
"description": (None, "这是文件说明") # 注意:value用None表示无文件名
}
response = requests.post(upload_url, files=files)
print(response.json()["files"]) # 查看上传的文件详情
关键点:
files参数接收一个字典,每个键对应表单字段名。- 值是一个元组:
(文件名, 文件对象, MIME类型)。 - 如果只需要上传文件内容而无需文件名,可以省略文件名:
files = {"image": ("", open("photo.jpg", "rb"), "image/jpeg")} - 大文件上传:使用
stream=True分块读取,避免内存溢出。
常见错误与调试技巧
错误1:超时
requests.post(url, data=payload, timeout=5) # 设置5秒超时
错误2:SSL证书验证
requests.post(url, verify=False) # 跳过验证(不推荐) # 或使用自定义证书 requests.post(url, verify="/path/to/cert.pem")
错误3:返回非200状态码
response = requests.post(url, data=data) response.raise_for_status() # 如果状态码不是200,抛出HTTPError异常
调试技巧:打印请求详情
import requests
# 启用调试日志
import logging
logging.basicConfig(level=logging.DEBUG)
requests.post("https://httpbin.org/post", data={"key": "value"})
你会看到完整的请求头和请求体,方便排查编码或格式问题。
问答环节:你关心的POST请求问题
Q1: requests的data和json参数有什么区别?
A:
data:发送表单格式(application/x-www-form-urlencoded),适合简单键值对。json:发送JSON格式(application/json),自动序列化字典/列表,适合复杂结构数据。- 两者不能同时使用,否则会报错。
Q2: 如何携带cookie进行POST请求?
A: 使用cookies参数:
cookies = {"session_id": "abc123"}
requests.post(url, data=data, cookies=cookies)
或者通过Session对象保持全局cookie:
s = requests.Session() s.post(login_url, data=login_data) # 登录后cookie自动保存 s.post(profile_url, data=update_data) # 使用同一会话
Q3: POST请求可以包含查询参数吗?
A: 可以,用params参数:
requests.post("https://api.example.com/search?page=1", data={"q": "python"}, params={"sort": "asc"})
最终URL变为:https://api.example.com/search?page=1&sort=asc
Q4: 若服务器要求特定的Content-Type怎么办?
A: 手动设置headers:
headers = {"Content-Type": "text/plain; charset=utf-8"}
requests.post(url, data="hello", headers=headers)
Q5: 如何上传多个同名文件(如多文件上传)?
A: 使用元组列表:
files = [
("images", ("img1.jpg", open("img1.jpg", "rb"))),
("images", ("img2.png", open("img2.png", "rb")))
]
response = requests.post(url, files=files)
总结与最佳实践
核心知识点速查表
| 数据类型 | 参数 | Content-Type | 适用场景 |
|---|---|---|---|
| 表单 | data |
application/x-www-form-urlencoded |
登录、简单表单 |
| JSON | json |
application/json |
现代API、复杂数据 |
| 文件 | files |
multipart/form-data |
上传文件、混合表单 |
牢记几条黄金规则:
- 永远设置超时:避免程序卡死。
- 使用Session复用连接:批量请求时效率更高。
- 捕获异常:用try/except包裹网络请求。
- 测试用
httpbin.org:确认请求格式无误。 - 保持代码可读:将URL、数据、headers定义为变量。
下一站进阶:
- 异步POST请求:使用
aiohttp或httpx。 - 带重试机制的请求:使用
requests.adapters.HTTPAdapter。 - 处理大文件上传:使用
requests-toolbelt的MultipartEncoder。
通过这三个案例和问答,你已经掌握了Python POST请求的核心用法,无论是对接API、自动化办公还是爬虫,这些技巧都将成为你的得力工具,立即打开你的编辑器,动手试试吧!