HTTP 請求體格式詳解

在這里插入圖片描述

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 值及其對應的時間戳…