在这里插入图片描述

1. 概览与概念

  • Content-Type:HTTP 请求/响应头,表示消息体的媒体类型(MIME type)。服务端用它决定如何解析请求体。
  • 常见场景:
    • 纯结构化数据(JSON) → application/json
    • 表单 + 文件上传 → multipart/form-data
    • 简单表单键值对(HTML 表单默认)→ application/x-www-form-urlencoded
    • 纯文本 → text/plain
    • 原始二进制文件流 → application/octet-stream

选择策略:如果只传结构化数据(没有文件),优先 application/json;如果需要上传文件,使用 multipart/form-data

2. application/json

定义

请求体为 JSON 文本。服务器按 JSON 解析整个请求体。

何时使用

  • 只传结构化数据(对象 / 数组 / 嵌套结构),不含文件。
  • 常见于 RESTful API、微服务间通信、前端与后端交互。

请求头

Content-Type: application/json; charset=utf-8

客户端示例

curl

curl -X POST "http://example.com/api" \-H "Authorization: Bearer TOKEN" \-H "Content-Type: application/json" \-d '{"indexing_technique":"high_quality","process_rule":{"mode":"custom"}}'

Python (requests)

import requests
url = "http://example.com/api"
headers = {"Authorization": "Bearer TOKEN"}
data = {"indexing_technique": "high_quality", "process_rule": {"mode": "custom"}}
resp = requests.post(url, headers=headers, json=data)  # 使用 json 参数,requests 会自动序列化并设置 Content-Type

Apifox/Postman:Body → 选择 raw → JSON,填入 JSON。

服务端解析

多数框架能自动解析 JSON:例如 Flask (request.json) / FastAPI(声明模型)等。

注意点

  • 必须是合法 JSON(不能有单引号、不允许在外层多包一层字符串)。
  • 如果要上传文件,不能用 application/json(文件会被二进制编码成 base64,但那不是推荐方式,且会增大尺寸)。

3. multipart/form-data

定义

表单分段(multipart),每个部分(part)都有自己的 headers(Content-Disposition、可选 Content-Type),适合混合文本字段与文件字段。

何时使用

  • 需要上传文件(图片、文档、音频等)
  • 同时需要传复杂 JSON(把 JSON 放在一个 text 字段里)和文件

请求头(示例)

Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryX

boundary 是库自动生成,用于分隔各个 part。

客户端示例

curl

curl -X POST "http://example.com/upload" \-H "Authorization: Bearer TOKEN" \-F 'data={"indexing_technique":"high_quality"};type=text/plain' \-F 'file=@/path/to/file.png'

注意:不要在 -F 'data="{...}"' 外层再加额外的引号,这会让服务器把 data 当成字符串,造成解析失败(例如你遇到的 indexing_technique=None 问题)。

Python (requests) — 推荐写法:

import requests, json
url = "http://example.com/upload"
headers = {"Authorization": "Bearer TOKEN"}
json_payload = {"indexing_technique": "high_quality"}
files = {# 文本字段: (filename, content, content_type) -> filename 为 None 或空"data": (None, json.dumps(json_payload), "text/plain"),# 文件字段"file": ("file.png", open("/path/to/file.png", "rb"))
}
resp = requests.post(url, headers=headers, files=files)

Apifox/Postman:Body → form-data,添加:

  • key=data type=Text,值填 {"indexing_technique":"high_quality"}(不要额外的双引号)
  • key=file type=File,选择文件

服务端解析

  • 在 Flask:使用 request.form(文本字段)与 request.files(文件字段)
  • 在 FastAPI:使用 UploadFileForm() 来接收

示例(FastAPI)

from fastapi import FastAPI, File, UploadFile, Form
import json
app = FastAPI()@app.post('/upload')
async def upload(data: str = Form(...), file: UploadFile = File(...)):# data 是表单里的字符串,通常存放 JSON,需要 json.loadspayload = json.loads(data)content = await file.read()return {"received": payload, "filename": file.filename}

常见坑

  • 把 JSON 用外层双引号包裹(整个 JSON 当作一个字符串)会被解析成字符串,导致字段缺失或类型错误。
  • 指定了错误的 Content-Type(例如把 data 的 Content-Type 写成 application/json)在某些库下会影响解析方式——requestsfiles 会给 part 自动附 content-type。

4. application/x-www-form-urlencoded

定义

表单键值对序列化为 key1=value1&key2=value2,类似 HTML 表单的默认提交方式,不支持文件上传。

何时使用

  • 简单表单提交(登录、查询参数)
  • 浏览器表单提交(不含文件)

客户端示例

curl

curl -X POST "http://example.com/login" \-H "Content-Type: application/x-www-form-urlencoded" \-d "username=alice&password=secret"

Python (requests)

requests.post(url, data={"username": "alice", "password": "secret"})

Apifox/Postman:Body → x-www-form-urlencoded,按 key/value 填写。

服务端解析

  • Flask:request.form['username']
  • FastAPI:使用 Form() 来接收

5. text/plainapplication/octet-stream

text/plain

  • 用于传输简单纯文本(非 JSON 结构),如传一段日志、一段脚本、或问题描述。
  • 示例:curl -X POST -H "Content-Type: text/plain" --data "hello world" http://...

application/octet-stream

  • 二进制流,适用于直接上传文件的原始字节流(例如大文件或非表单上传的情形)。

  • 示例:将文件直接作为请求体,而不是 multipart:

    curl -X PUT "http://example.com/upload/raw" \-H "Content-Type: application/octet-stream" \--data-binary @/path/to/bigfile.bin
    
  • 服务器端通常把整个请求体当成字节流读取并保存。

6. 服务端如何接收(示例)

FastAPI(包括 JSON、multipart、raw)

from fastapi import FastAPI, File, UploadFile, Form, Request
import json
app = FastAPI()@app.post('/json')
async def recv_json(payload: dict):# 当 Content-Type: application/json 且 body 是 JSON,FastAPI 会自动解析并传入 dictreturn {"ok": True, "payload": payload}@app.post('/upload-multipart')
async def upload_multipart(data: str = Form(...), file: UploadFile = File(...)):payload = json.loads(data)contents = await file.read()return {"ok": True, "name": file.filename, "payload": payload}@app.put('/upload-raw')
async def upload_raw(request: Request):# 适合 application/octet-streambody = await request.body()# 保存到文件示例with open('/tmp/out.bin', 'wb') as f:f.write(body)return {"ok": True, "size": len(body)}

Flask(简洁示例)

from flask import Flask, request, jsonify
import json
app = Flask(__name__)@app.route('/json', methods=['POST'])
def json_route():payload = request.get_json(force=True)return jsonify(ok=True, payload=payload)@app.route('/upload', methods=['POST'])
def upload():data = request.form.get('data')payload = json.loads(data)file = request.files['file']file.save('/tmp/' + file.filename)return jsonify(ok=True)@app.route('/raw', methods=['PUT'])
def raw():body = request.data  # bytesopen('/tmp/out.bin', 'wb').write(body)return jsonify(ok=True, size=len(body))

7. 常见错误、坑与排查建议

  1. 外层多加引号导致 JSON 变成字符串

    • 问题表现:服务端解析后字段为 None 或整个字段是一个字符串。
    • 排查:打印收到的原始 body(或查看 request.form),看是否是 "{...}"
  2. 错误的 Content-Type

    • 例如把 multipart 的 part 标为 application/json,或把整个请求标为 text/plain
    • 排查:抓包(浏览器 DevTools / tcpdump / ngrok / mitmproxy)或在服务端记录 request.headers
  3. 字符编码问题(中文 / Emoji)

    • 保证 charset=utf-8,并在客户端使用 UTF-8 编码发送。
  4. 大文件上传失败或超时

    • 原因:服务器限制(Nginx client_max_body_size、框架上传限制)、超时。
    • 解决:增大限制、分片上传、直接使用云存储的分片接口(S3 multipart upload)等。
  5. boundary 被破坏

    • 当手动拼接 multipart 而 boundary 未正确设置或被转义时会失败。建议使用客户端库(requests、curl、Postman)自动处理。
  6. 证书/代理/跨域问题

    • POST 跨域:浏览器会发 OPTIONS 预检,请确保服务器允许 CORS 并处理 Content-Type。服务器需返回合适的 Access-Control-Allow-Headers

8. 性能、安全与兼容性建议

  • 压缩:对于较大的 JSON 或文本,可启用 gzip 压缩(Content-Encoding: gzip),但客户端/服务器需支持。注意:Content-TypeContent-Encoding 是不同维度。
  • 范围/分片上传:对于大文件,优先使用分片上传(客户端 + 服务端/云端支持),避免单次上传失败带来的重试成本。
  • 限速与大小控制:服务端应在网关或 Nginx 上配置大小限制、请求超时和速率限制。
  • 校验:文件上传建议校验 Content-Type(魔数/文件头)与文件大小,并在可能的场景下进行病毒扫描。
  • 认证:在上传接口强制认证与授权,避免未授权的大流量上传。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96112.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96112.shtml
英文地址,请注明出处:http://en.pswp.cn/web/96112.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

事务设置和消息分发

事务 RabbitMQ是基于AMQP协议实现的,该协议实现了事务机制,因此RabbitMQ也支持事务机制. SpringAMQP也提供了对事务相关的操作,RabbitMQ事务允许开发者确保消息的发送和接收是原子性的,要么 全部成功,要么全部失败.| 前…

Python 中 try / except / else / finally 异常处理详解

1. 基本结构 try:# 可能会抛出异常的代码 except SomeException as e:# 捕获并处理异常 else:# 如果 try 中代码没有异常,就执行这里 finally:# 无论是否发生异常,最后都会执行这里2. 各部分的作用 try 用途:包含可能发生异常的代码段。如果代…

冰火岛 Tech 传:Apple Foundation Models 心法解密(下集)

引子 上集说到冰火岛冰屋内,谢逊、张翠山、殷素素三人亲见 “指令(Instructions)” 如何让 AI 脱胎换骨,从木讷报地名的 “愣头青”,变身为文采斐然的 “旅行作家”。 正当素素惊叹这 AI 武学的奇妙时,谢逊却突然神色一凛,指着手腕上用冰屑刻的 “4096” 字样道:“这等…

Qt信号与槽机制全面解析

✨ 1. 核心概念信号与槽是Qt独创的一种对象间通信机制,它使得一个对象的状态变化或事件发生能够自动通知其他对象作出响应,从而实现高度解耦的代码设计。1.1 信号(Signals)定义:信号是由对象在特定事件发生时发出&…

2025年COR SCI2区,基于近似细胞分解的能源高效无人机路径规划问题用于地质灾害监测,深度解析+性能实测

目录1.摘要2.问题描述与数学模型3.能源网格混合元启发式算法4.结果展示5.参考文献6.代码获取7.算法辅导应用定制读者交流1.摘要 本文提出了一种能源高效的无人机路径规划方法(EURP)用于监测分散的地质灾害易发区域,通过建立无人机飞行模式的…

LangChain关于提示词的几种写法

上文中 <---->(可点击移步查阅),我们已经了解到LangChain如何编写调用大模型的一个基本框架, 在编写完这个基本框架后,就要与大模型进行交互了,这时候,就需要我们编写提示词了, 那么以下,就会介绍提示词的几种编写方式 1 可携带变量的提示词 1.1 PromptTempla…

CyberPoC 是一个现代化的网络安全练习和竞赛平台,支持容器化部署的安全挑战,为用户提供实践网络安全技能的环境。

工具介绍 CyberPoC 是一个现代化的网络安全练习和竞赛平台&#xff0c;支持容器化部署的安全挑战&#xff0c;为用户提供实践网络安全技能的环境。 &#x1f680; 快速开始 使用 Docker Compose (推荐) 克隆项目 git clone https://github.com/dushixiang/cyberpoc.gitcd cy…

【单片机day03】

UART串口通用异步收发器&#xff0c;2个串口(1个串口被用于ISP下载程序&#xff0c;1个串口被用于和主机之间的通信)全双工&#xff08;两根线TX、RX&#xff09;、串行、异步通信方式&#xff1a;单工&#xff1a;发送方和接收方是固定的&#xff0c;数据只能从发送方 发给 …

react16到react19更新及底层实现是什么以及区别

好问题 &#x1f44d;。React 16 → 19 的更新跨度其实涵盖了 React 的几个“时代级”的演进&#xff1a;从 Fiber 架构 的重写、到 并发特性 的引入&#xff0c;再到 React Server Components 和 现代语法支持。我帮你梳理下主要更新点和底层实现的区别&#xff0c;方便你系统…

【分享】基于百度脑图,并使用Vue二次开发的用例脑图编辑器组件

偶然间发现了这个项目&#xff0c;分享出来。 【分享】基于百度脑图&#xff0c;并使用Vue二次开发的用例脑图编辑器组件1 项目地址2 项目简介3 项目部署3.1 安装node和npm3.2 项目下载3.3 修改npm镜像源3.4 部署4 项目中使用1 项目地址 基于百度脑图&#xff0c;并使用Vue二次…

Kotlin中抽象类和开放类

抽象类 (Abstract Class) 定义和特点 抽象类使用 abstract 关键字声明&#xff0c;是一种不能被直接实例化的特殊类&#xff0c;主要用于被其他类继承。 abstract class Base {open fun f() {} }abstract class Derived : Base() {override abstract fun f() // 抽象成员在类中…

TensorFlow深度学习实战(37)——深度学习的数学原理

TensorFlow深度学习实战&#xff08;37&#xff09;——深度学习的数学原理0. 前言1. 反向传播历史2. 微积分相关概念2.1 向量2.2 导数和梯度2.3 梯度下降2.4 链式法则2.5 常用求导公式2.6 矩阵运算3. 激活函数4. 反向传播4.1 前向计算4.2 反向传播5. 交叉熵及其导数6. 批量梯度…

1.1 汽车运行滚动阻力

汽车运行阻力由4部分构成&#xff1a;滚动阻力、空气阻力、坡度阻力、加速阻力。 1).汽车在水平道路上等速行驶时&#xff0c;必须克服来自地面的滚动阻力和来自空气的空气阻力。 2). 当汽车在坡道上上坡行驶时&#xff0c;还必须克服重力沿坡道的分力&#xff0c;称为坡度阻…

e203000

1&#xff09;①BIU作为核心通信枢纽&#xff0c;主要承担两大功能&#xff1a;一是连接处理器核内的关键执行单元&#xff08;包括IFU、LSU和EAI协处理器&#xff09;&#xff0c;统一管理指令和数据的内部传输路径&#xff1b;二是作为"核内计算"与"核外资源&…

Infortrend普安科技IEC私有云平台VM解决方案

Infortrend企业云&#xff08;IEC&#xff09;内置Hypervisor运行VM。功能完整、无需额外付费。在本文中&#xff0c;我们将为您详细介绍IEC是如何支持 VM的。市场现状与挑战市场现状 虚拟化市场面临转型&#xff0c;主流厂商&#xff08;如 VMware&#xff09;改用订阅制…

【代码随想录算法训练营——Day6(Day5周日休息)】哈希表——242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和

LeetCode题目链接 https://leetcode.cn/problems/valid-anagram/ https://leetcode.cn/problems/intersection-of-two-arrays/ https://leetcode.cn/problems/happy-number/ https://leetcode.cn/problems/two-sum/ 题解 242.有效的字母异位词 这道题要想到用哈希表来做。同时注…

安科瑞基站智慧运维云平台:安全管控与节能降耗双效赋能

功能&#xff1a;基站智慧用电云平台通过对5G宏站和室分站点加装交/直流智能监控设备、无线采集设备以及系统管理平台&#xff0c;完成夜间无业务时段的下电操作&#xff0c;减少电能消耗&#xff0c;降低运营成本支出&#xff0c;以及提升通信设备供电线路状态的实时监测保护功…

处理省市区excel数据加工成SQL

原始数据相关内容链接 处理excel数据加工成SQL的脚本 #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Excel行政区域数据转SQL脚本 - 支持特殊行政单位处理&#xff08;如省直辖县级行政单位&#xff09; - 支持批量处理 """import pand…

双碳目标下的24小时分时综合能源系统低碳优化调度:基于 Matlab/YALMIP/CPLEX的方法与仿真

在“双碳”战略目标的推动下&#xff0c;综合能源系统&#xff08;Integrated Energy System, IES&#xff09;已成为实现能源结构优化与碳排放控制的重要途径。本文以光伏、风电、燃气—电热联产&#xff08;CHP&#xff09;、燃气锅炉、电锅炉、电储能以及碳捕集&#xff08;…

TDengine 选择函数 Last() 用户手册

LAST() 函数用户手册 函数定义 LAST(expr)功能说明 LAST() 函数统计表/超级表中某列的值最后写入的非 NULL 值&#xff0c;即返回时间戳最大的非 NULL 值。 版本要求 最低版本: v3.0.0.0 返回值 数据类型: 同应用的字段返回内容: 时间戳最大的非 NULL 值及其对应的时间戳…