pin_drop当前位置:知识文库 ❯ 图文
requests.post()详解 - Python发送POST请求完整教程
目录
一、requests.post()概述
requests.post() 用于向服务器发送HTTP POST请求,通常用于提交表单数据、上传文件或发送JSON数据。与GET请求不同,POST请求的数据放在请求体(Request Body)中,不会暴露在URL中,适合传递敏感信息和大量数据。
POST请求是Web开发中最常用的数据提交方式。无论是用户登录、注册、发布文章,还是调用API创建资源,都离不开POST请求。requests.post()支持多种数据格式,包括表单数据、JSON数据、文件上传等,灵活应对各种业务场景。
二、语法与参数详解
代码示例
requests.post(url, data=None, json=None, **kwargs)
返回值:返回一个 requests.Response 对象。
三、发送表单数据
使用 data 参数发送表单数据时,requests会自动将字典编码为 application/x-www-form-urlencoded 格式:
代码示例
import requests
# 发送表单数据(Content-Type: application/x-www-form-urlencoded)
form_data = {
'username': 'admin',
'password': '123456',
'remember': 'true'
}
response = requests.post('https://httpbin.org/post', data=form_data)
result = response.json()
print(f"状态码: {response.status_code}")
print(f"Content-Type: {result['headers'].get('Content-Type', '未设置')}")
print(f"表单数据: {result['form']}")输出:
代码示例
状态码: 200
Content-Type: application/x-www-form-urlencoded
表单数据: {'username': 'admin', 'password': '123456', 'remember': 'true'}四、发送JSON数据
现代API大多使用JSON格式进行数据交换。使用 json 参数发送数据时,requests会自动将字典序列化为JSON字符串,并设置 Content-Type: application/json:
代码示例
import requests
# 发送JSON数据(Content-Type: application/json)
json_data = {
'name': '张三',
'age': 25,
'skills': ['Python', 'Java', 'Go'],
'address': {
'city': '北京',
'district': '海淀区'
}
}
response = requests.post('https://httpbin.org/post', json=json_data)
result = response.json()
print(f"Content-Type: {result['headers'].get('Content-Type', '未设置')}")
print(f"JSON数据: {result['json']}")
print(f"数据类型: {type(result['json'])}")输出:
代码示例
Content-Type: application/json
JSON数据: {'name': '张三', 'age': 25, 'skills': ['Python', 'Java', 'Go'], 'address': {'city': '北京', 'district': '海淀区'}}
数据类型: <class 'dict'>五、发送原始二进制数据
在某些场景下,需要发送原始的二进制数据。可以通过将数据编码为bytes,然后手动设置Content-Type来实现:
代码示例
import requests
import json
# 方式1:手动序列化JSON并设置请求头
payload = json.dumps({'key': 'value'}, ensure_ascii=False)
headers = {'Content-Type': 'application/json; charset=utf-8'}
response = requests.post('https://httpbin.org/post', data=payload.encode('utf-8'), headers=headers)
result = response.json()
print(f"方式1数据: {result['json']}")
# 方式2:发送纯文本数据
text_data = '这是一段纯文本数据'
response2 = requests.post(
'https://httpbin.org/post',
data=text_data.encode('utf-8'),
headers={'Content-Type': 'text/plain; charset=utf-8'}
)
result2 = response2.json()
print(f"方式2数据: {result2['data']}")输出:
代码示例
方式1数据: {'key': 'value'}
方式2数据: 这是一段纯文本数据小贴士
在大多数情况下,直接使用 json 参数即可,它会自动处理序列化和Content-Type设置。手动编码只在你需要精确控制JSON格式(如缩进、编码选项)时才使用。
六、实际应用场景
-
用户登录系统:通过POST请求提交用户名和密码进行身份验证,获取Token或Session
-
RESTful API创建资源:调用API提交订单、发布文章、添加用户等创建操作
-
Webhook集成:向第三方服务(如钉钉、企业微信、Slack)推送事件通知数据
-
文件上传:通过multipart/form-data格式上传文件或图片到服务器
七、注意事项
参数互斥:
data参数和json参数不要同时使用,json参数优先级更高,同时使用时data会被忽略Content-Type差异:使用data参数传递字典时,Content-Type为application/x-www-form-urlencoded;使用json参数时,Content-Type为application/json
非幂等性:POST请求不是幂等的,多次提交可能创建多个资源,需注意防重复提交(可通过Token或唯一约束实现)
八、POST数据格式对比
理解不同数据格式的适用场景,是正确使用POST请求的关键:
九、课后练习
练习1
使用requests.post()向 https://httpbin.org/post 发送表单数据,包含姓名、邮箱和手机号字段,打印服务器收到的数据
练习2
使用requests.post()发送JSON格式的订单数据(包含商品名、数量、价格),打印服务器返回的JSON内容
练习3
编写一个函数,根据参数类型自动选择使用data还是json发送POST请求,并处理可能的异常
常见问题
data参数和json参数有什么区别?
data参数将字典编码为表单格式(key=value&key=value),Content-Type为application/x-www-form-urlencoded;json参数将字典序列化为JSON字符串,Content-Type为application/json。调用RESTful API时通常使用json参数,提交HTML表单时使用data参数。
POST请求如何上传文件?
使用files参数上传文件:files = {'file': open('test.txt', 'rb')}; requests.post(url, files=files)。requests会自动使用multipart/form-data编码。
如何防止POST请求重复提交?
可以在请求中添加唯一Token(如UUID),服务器端验证Token是否已使用。另外,数据库层面可以对关键字段设置唯一约束,从根源上防止重复数据。
json参数和data=json.dumps()有什么区别?
json参数自动序列化字典并设置Content-Type为application/json;data=json.dumps()需要手动序列化且不会自动设置Content-Type(需要额外添加headers)。json参数更简洁,推荐使用。
本文涉及AI创作
内容由AI创作,请仔细甄别