python requests库如何发送post请求_python requests库POST请求发送方法

尼克
发布: 2025-09-15 19:23:01
原创
1018人浏览过
requests.post()方法通过data、json和files参数分别处理表单、JSON和文件上传,结合headers可自定义请求头,实现灵活的POST请求。

python requests库如何发送post请求_python requests库post请求发送方法

Python的

requests
登录后复制
库在发送POST请求时,提供了极其简洁且功能强大的接口,核心就是
requests.post()
登录后复制
方法。它能够轻松处理表单数据、JSON负载、文件上传乃至复杂的认证场景,让HTTP请求变得像呼吸一样自然,极大简化了开发者与Web服务交互的复杂性。

解决方案: 说实话,刚开始接触

requests
登录后复制
库的时候,我最喜欢的就是它发POST请求的简洁性。一个
post()
登录后复制
调用,几乎就能搞定大部分需求。但实际操作起来,远不止一个简单的调用那么直白,背后有很多细节值得我们琢磨,尤其是在处理不同数据类型和错误时。

最基础的POST请求,通常会带上一些数据。这些数据可以是表单形式(

application/x-www-form-urlencoded
登录后复制
),也可以是JSON格式(
application/json
登录后复制
)。

对于表单数据,我们通常会用到

data
登录后复制
参数,它接受一个字典,
requests
登录后复制
会自动将其编码为URL编码格式:

import requests

url = "https://httpbin.org/post" # 这是一个测试POST请求的公共服务

payload = {
    "name": "Alice",
    "age": 30,
    "city": "New York"
}

try:
    response = requests.post(url, data=payload)
    response.raise_for_status() # 如果状态码不是200,会抛出HTTPError异常
    print("表单数据发送成功!")
    print(response.json())
except requests.exceptions.RequestException as e:
    print(f"请求失败: {e}")
登录后复制

如果你需要发送JSON数据,

requests
登录后复制
库更是贴心地提供了
json
登录后复制
参数。它会自动将你的Python字典序列化为JSON字符串,并设置正确的
Content-Type: application/json
登录后复制
头,省去了我们手动
json.dumps()
登录后复制
的麻烦。

立即学习Python免费学习笔记(深入)”;

import requests

url = "https://httpbin.org/post"

json_payload = {
    "product_id": "P123",
    "quantity": 5,
    "options": ["color:red", "size:M"]
}

try:
    response = requests.post(url, json=json_payload)
    response.raise_for_status()
    print("\nJSON数据发送成功!")
    print(response.json())
except requests.exceptions.RequestException as e:
    print(f"请求失败: {e}")
登录后复制

有时,我们还需要自定义请求头,比如添加认证信息、User-Agent等,或者处理某些特定的

Content-Type
登录后复制
。这可以通过
headers
登录后复制
参数实现,它同样接受一个字典。

import requests

url = "https://httpbin.org/post"

custom_headers = {
    "User-Agent": "MyCustomApp/1.0",
    "Authorization": "Bearer your_token_here",
    "X-Custom-Header": "HelloFromPython"
}

payload = {"message": "This request has custom headers."}

try:
    response = requests.post(url, data=payload, headers=custom_headers)
    response.raise_for_status()
    print("\n带自定义头的请求发送成功!")
    print(response.json())
except requests.exceptions.RequestException as e:
    print(f"请求失败: {e}")
登录后复制

如何发送不同类型的数据:表单、JSON与原始字节流?

这是一个非常实际的问题,因为后端API对数据格式的要求五花八门。理解

requests
登录后复制
如何处理这些差异,能省去不少调试的麻烦,尤其是当你的请求总是返回400 Bad Request的时候,多半是这里出了问题。

requests.post()
登录后复制
方法在处理数据时,主要依赖
data
登录后复制
json
登录后复制
这两个参数。它们各自有明确的用途和隐式行为。

Linfo.ai
Linfo.ai

Linfo AI 是一款AI驱动的 Chrome 扩展程序,可以将网页文章、行业报告、YouTube 视频和 PDF 文档转换为结构化摘要。

Linfo.ai 151
查看详情 Linfo.ai

当你使用

data
登录后复制
参数时,
requests
登录后复制
默认会把你的字典或元组列表编码成
application/x-www-form-urlencoded
登录后复制
格式。这就像浏览器提交一个HTML表单时做的事情。如果你传入的是一个字符串或字节流,
requests
登录后复制
会直接将其作为请求体发送,此时你需要自己设置
Content-Type
登录后复制
头。比如,你想发送一段XML或者其他自定义格式的原始数据:

import requests

url = "https://httpbin.org/post"
xml_data = "<root><item>Hello XML</item></root>"
headers = {"Content-Type": "application/xml"}

try:
    response = requests.post(url, data=xml_data, headers=headers)
    response.raise_for_status()
    print("\n发送XML数据:")
    print(response.text)
except requests.exceptions.RequestException as e:
    print(f"请求失败: {e}")
登录后复制

json
登录后复制
参数,正如前面提到的,是为JSON数据量身定制的。它会自动帮你完成两件事:将Python字典或列表转换为JSON字符串,并且将
Content-Type
登录后复制
请求头设置为
application/json
登录后复制
。这是我个人觉得
requests
登录后复制
最方便的功能之一,因为它省去了手动导入
json
登录后复制
库再
json.dumps()
登录后复制
的步骤,让代码看起来更干净。

选择哪个参数,完全取决于你的API要求。如果API文档明确要求

application/x-www-form-urlencoded
登录后复制
,那就用
data
登录后复制
。如果要求
application/json
登录后复制
json
登录后复制
参数无疑是最佳选择。搞清楚这一点,能避免很多“为什么我的数据发不出去”的困惑。

使用
requests.post()
登录后复制
上传文件:具体操作与常见陷阱

文件上传是POST请求的另一个高频场景,比如上传图片、文档或者其他二进制文件。

requests
登录后复制
库通过
files
登录后复制
参数,让这个过程变得异常简单,它会自动构建
multipart/form-data
登录后复制
请求,这是浏览器上传文件时的标准做法。

files
登录后复制
参数接受一个字典,字典的键是表单中对应的文件字段名,值可以是文件对象(已打开的文件)、元组(
('filename', file_object)
登录后复制
)、或者更复杂的元组(
('filename', file_object, 'content_type', custom_headers)
登录后复制
)。

最常见的情况是上传单个文件:

import requests
import os

url = "https://httpbin.org/post"

# 假设我们有一个名为 'example.txt' 的文件
# 先创建一个模拟文件以供上传
file_path = "example.txt"
with open(file_path, "w") as f:
    f.write("This is a test file content.\n")
    f.write("Line two of the test file.")

try:
    with open(file_path, "rb") as f: # 注意这里是'rb'模式,以二进制读取
        files = {"upload_file": f} # 'upload_file'是服务器期望接收的文件字段名
        response = requests.post(url, files=files)
        response.raise_for_status()
        print("\n文件上传成功!")
        print(response.json())
except requests.exceptions.RequestException as e:
    print(f"请求失败: {e}")
finally:
    if os.path.exists(file_path):
        os.remove(file_path) # 清理模拟文件
登录后复制

你甚至可以同时发送文件和其他表单数据,

requests
登录后复制
会智能地将它们组合成一个
multipart/form-data
登录后复制
请求:

import requests
import os

url = "https://httpbin.org/post"

# 再次创建模拟文件
file_path_2 = "another_example.txt"
with open(file_path_2, "w") as f:
    f.write("Another test file for combined upload.")

try:
    with open(file_path_2, "rb") as f:
        # 指定文件名和Content-Type,以及其他表单数据
        files = {"document": ("report.txt", f, "text/plain")}
        data = {"title": "Monthly Report", "year": 2023}
        response = requests.post(url, files=files, data=data)
        response.raise_for_status()
        print("\n文件与表单数据一同上传成功!")
        print(response.json())
except requests.exceptions.RequestException as e:
    print(f"请求失败: {e}")
finally:
    if os.path.exists(file_path_2):
        os.remove(file_path_2
登录后复制

以上就是python requests库如何发送post请求_python requests库POST请求发送方法的详细内容,更多请关注php中文网其它相关文章!

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号