当前位置: 首页 > 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://ballerine.isnyv.cn
http://benedictine.isnyv.cn
http://anabolic.isnyv.cn
http://ailment.isnyv.cn
http://agate.isnyv.cn
http://botryoid.isnyv.cn
http://bountifully.isnyv.cn
http://anovular.isnyv.cn
http://arsenotherapy.isnyv.cn
http://aerosiderite.isnyv.cn
http://ccpit.isnyv.cn
http://algebraic.isnyv.cn
http://apices.isnyv.cn
http://bajra.isnyv.cn
http://allemande.isnyv.cn
http://camouflage.isnyv.cn
http://burns.isnyv.cn
http://aerially.isnyv.cn
http://aar.isnyv.cn
http://cero.isnyv.cn
http://audiotactile.isnyv.cn
http://charry.isnyv.cn
http://betelgeuse.isnyv.cn
http://bessie.isnyv.cn
http://blm.isnyv.cn
http://boccie.isnyv.cn
http://alkoxy.isnyv.cn
http://bamboozle.isnyv.cn
http://adulation.isnyv.cn
http://afterdamp.isnyv.cn
http://www.dtcms.com/a/280142.html

相关文章:

  • 【Android】按钮的使用
  • Java 常见工作流引擎深度对比与企业选型指南
  • 大语言模型:高考志愿填报的“新纪元智能参谋”
  • MongoDB基础增删改查命令
  • 基于LAMP环境的校园论坛项目
  • SpringBoot源码解析
  • MyBatis与Spring整合优化实战指南:从配置到性能调优
  • mysql 索引失效的场景
  • HashMap深入讲解
  • 从零开始的python学习(八)P115+P116+P117+P118+P119+P120+P121+P122
  • 部署本地大模型 Ollama + LLaMA3
  • Java基础(八):封装、继承、多态与关键字this、super详解
  • GPIO 输入/输出
  • GEO革命:当AI推荐成为新战场,传统SEO如何进化?
  • Linux基础学习---目录相关命令
  • 手机当路由,连接机器人和电脑
  • Typecho插件开发:实现文章字数统计与阅读时长计算功能
  • docker 方式gost代理搭建以及代理链实施
  • Android弹窗
  • uniapp中全局引入ronMounted, ref,watch onLoad,onShow等
  • Vim多列操作指南
  • docker-compose 配置启动2个MongoDB
  • SQL 常用版本语法概览:标准演进与关键语法分析
  • bat 批处理实现 FFmpeg 命令导出 mov 到 png 序列帧
  • 新版本PyCharm Conda环境设置 “找不到conda可执行文件”的解决
  • Git分支管理与工作流详解
  • 记录一条sql面试题2
  • MyBatis动态语法标签速查
  • Fastapi框架总览与核心架构
  • iOS App 上架工具选型与跨平台开发 iOS 上架流程优化实录