当前位置: 首页 > news >正文

理解 HTTP POST 请求中的 json 和 data 参数

在使用 Python 发送 HTTP POST 请求时(无论是使用 requests 还是 aiohttp),json 和 data 参数有明确的区别和使用场景。理解这些区别对正确构建请求至关重要。

关键区别

特性json 参数data 参数
内容类型自动设置为 application/json需要手动设置(默认是 application/x-www-form-urlencoded
数据处理自动序列化 Python 对象为 JSON需要手动序列化
使用场景API 请求(JSON-RPC, RESTful API)表单提交、文件上传、自定义格式
编码UTF-8取决于内容类型
易用性更简单(自动处理)需要更多手动工作

1. 何时使用 data 

参数: 使用场景:

  1. 表单提交(HTML 表单数据):

    python

    form_data = {"username": "john", "password": "secret"}
    response = requests.post("https://example.com/login", data=form_data)
  2. 文件上传

    python

    files = {"file": open("report.pdf", "rb")}
    response = requests.post("https://example.com/upload", files=files)
  3. 发送原始文本(非 JSON):

    python

    xml_data = "<user><name>John</name></user>"
    response = requests.post("https://example.com/api", data=xml_data,headers={"Content-Type": "application/xml"})
  4. 多部分表单数据

    python

    from aiohttp import FormDataform = FormData()
    form.add_field("username", "john")
    form.add_field("avatar", open("avatar.jpg", "rb"), filename="avatar.jpg",content_type="image/jpeg")async with session.post(url, data=form) as response:
  5. 自定义内容类型

    python

    custom_data = "custom format data"
    response = requests.post("https://example.com/api", data=custom_data,headers={"Content-Type": "text/plain"})

2. 何时使用 json 参数

使用场景:

  • 当 API 期望接收 JSON 格式的数据时(大多数现代 API 使用 JSON)

  • 当需要发送结构化数据(字典、列表等)

  • 当 API 文档指定请求体应为 JSON

示例:

python

import requestsdata = {"name": "John", "age": 30}
response = requests.post("https://api.example.com/users", json=data)

在 aiohttp 中:

python

async with session.post(url, json=params) as response:

优点:

  1. 自动设置 Content-Type: application/json 头

  2. 自动将 Python 对象序列化为 JSON

  3. 简化代码

3. 最佳实践建议

  1. 推荐使用 json=params

    python

    response = requests.post(url, headers=headers, json=params, timeout=60)
    • 更简洁

    • 更安全(自动处理序列化)

    • 自动设置正确的 Content-Type

  2. 如果使用 data,必须手动序列化

    python

    response = requests.post(url, headers=headers, data=json.dumps(params), timeout=60)
    • 确保传递的是字符串,不是字典,  手动将`params`字典序列化为JSON字符串,然后通过`data`参数发送

    • 确保设置了正确的 Content-Type

  3. 避免使用 data=params

    • 这总是错误的,除非您确实想发送表单数据, 这会将`params`字典编码为`application/x-www-form-urlencoded`格式(即表单数据),而不是JSON。

    • 对于 JSON API,会导致服务器解析错误

 

http://www.xdnf.cn/news/1127449.html

相关文章:

  • 【目标追踪】MUTR3D: A Multi-camera Tracking Framework via 3D-to-2D Queries
  • 快速了解 HTTPS
  • 【BUG处理】构建APK时遇到错误:‘flutter‘ 命令未被识别。这通常表示您的系统中未安装Flutter SDK或环境变量配置不正确。
  • 【亲测有效】ubuntu20.04服务器新建用户+vnc配置教程
  • 基于按键开源MultiButton框架深入理解代码框架(二)(指针的深入理解与应用)
  • 【橘子分布式】Thrift RPC(编程篇)
  • OMPL安装问题:CMake报错找不到ompl依赖
  • Linux探秘坊-------14.信号
  • Axios 完整功能介绍和完整示例演示
  • OSPFv3中LSA参数
  • 【Luogu】每日一题——Day3. P6392 中意 (数学 取模)
  • 【深度学习优化算法】06:动量法
  • Sentinel热点参数限流完整示例实现
  • 高温车间(60℃+)如何选高温/宽温边缘网关设备?
  • 如何把手机ip地址切换到外省
  • Datawhale 25年7月组队学习coze-ai-assistant Task1学习笔记:动手实践第一个AI Agent—英伦生活口语陪练精灵
  • 学习C++、QT---26(QT中实现记事本项目实现文件路径的提示、现在我们来学习一下C++类模板、记事本的行高亮的操作的讲解)
  • etcd自动压缩清理
  • QT——QComboBox组合框控件
  • Flink实战项目——城市交通实时监控平台
  • 函数柯里化详解
  • Luban配置教程
  • 如何在simulink中怎么获取足端轨迹代码解释?
  • 【卡尔曼滤波第六期】集合变换卡尔曼滤波 ETKF
  • PyTorch笔记7----------计算机视觉基础
  • SSM框架学习DI入门——day2
  • flutter弹窗:fluttertoast
  • AI-Compass LLM训练框架生态:整合ms-swift、Unsloth、Megatron-LM等核心框架,涵盖全参数/PEFT训练与分布式优化
  • 开通保存图片权限
  • 专业文档搜索工具,快速定位文本内容