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)
参数 类型 默认值 说明
url str 必填 请求的目标URL地址
data dict/bytes/file None 请求体数据,表单数据用字典,原始数据用bytes
json dict None JSON格式请求体,自动设置Content-Type为application/json
headers dict None 请求头字典
cookies dict/CookieJar None 请求携带的Cookie
files dict None 上传的文件,格式为{'field': ('filename', file_object)}
auth tuple/AuthBase None 认证信息
timeout float/tuple None 请求超时时间(秒)
verify bool/str True 是否验证SSL证书
proxies dict None 代理设置

返回值:返回一个 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请求的关键:

参数 Content-Type 数据格式 适用场景
data=dict application/x-www-form-urlencoded key=value&key=value 表单提交
json=dict application/json {"key":"value"} API接口调用
data=bytes 自定义 原始二进制 文件上传、自定义协议
files=dict multipart/form-data 多部分表单 文件上传+表单数据

九、课后练习

练习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参数更简洁,推荐使用。

标签: requests.post POST请求 JSON数据 表单提交 API调用 文件上传

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: requests.get()详解 - Python发送GET请求完整教程 下一篇: PUT与PATCH请求详解 - Python资源更新方法对比教程

poll相关推荐