HTTP/1.1 規範中 POST 方法用於向伺服器提交資料,但協定未強制規定資料編碼格式。伺服端依賴 Content-Type 標頭解析實體主體。本文系統解析四種主流 POST 提交方式的封裝格式、適用場景、伺服端解析要點與避坑指南。
POST /path HTTP/1.1 Host: example.com Content-Type: application/x-www-form-urlencoded; charset=utf-8 Content-Length: 42 title=test&sub[]=1&sub[]=2&sub[]=3
三大組成:請求行、請求標頭、實體主體。Content-Type 告知伺服器主體編碼方式。
<form> 預設編碼(未設 enctype)key1=val1&key2=val2,鍵值皆 URL 編碼POST /api HTTP/1.1 Content-Type: application/x-www-form-urlencoded; charset=utf-8 name=John+Doe&age=30&tags%5B%5D=php&tags%5B%5D=js
| 語言/框架 | 解析方式 |
|---|---|
| PHP | $_POST['name'], $_POST['tags'] 自動解析為陣列 |
| Node.js (Express) | app.use(express.urlencoded()) → req.body |
| Python (Flask) | request.form |
| Java (Spring) | @RequestParam 或 @ModelAttribute |
// jQuery 預設即此類型
$.ajax({
type: 'POST',
url: '/api',
data: { name: 'John', tags: ['php', 'js'] }, // 自動序列化
success: ...
});
<form enctype="multipart/form-data"> 必須指定boundary 隨機字串分隔欄位Content-Disposition、可選 Content-TypePOST /upload HTTP/1.1 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123 ------WebKitFormBoundaryABC123 Content-Disposition: form-data; name="title" My Photo ------WebKitFormBoundaryABC123 Content-Disposition: form-data; name="file"; filename="photo.jpg" Content-Type: image/jpeg (binary data...) ------WebKitFormBoundaryABC123--
boundary 必須足夠隨機避免與內容衝突filename 與 Content-Type--boundary-- 標示JSON.stringify 支援(IE8+)POST /api/users HTTP/1.1
Content-Type: application/json; charset=utf-8
{"name":"John","age":30,"tags":["php","js"],"address":{"city":"Taipei","zip":"100"}}
x-www-form-urlencoded 與 multipart/form-data。需自行處理:
<?php
// PHP 解析 JSON 請求
$contentType = $_SERVER['CONTENT_TYPE'] ?? '';
if (strpos($contentType, 'application/json') === 0) {
$json = file_get_contents('php://input'); // 讀取原始輸入流
$data = json_decode($json, true); // 解析為關聯陣列
// $data['name'], $data['tags'], $data['address']['city']...
}
x-www-form-urlencoded,需 contentType: 'application/json' + JSON.stringify(data)POST /xmlrpc HTTP/1.1 Content-Type: text/xmlexamples.getStateName 41
JSON 結構更輕量、解析更快、人類可讀性更好。除非對接遺留系統,新專案強烈建議使用 JSON。
| 維度 | x-www-form-urlencoded | multipart/form-data | application/json | text/xml |
|---|---|---|---|---|
| 適用場景 | 簡單鍵值表單 | 檔案上傳、混合表單 | REST API、複雜結構 | XML-RPC/SOAP 遺留 |
| 支援檔案 | ❌ | ✅ | ❌ (Base64 編碼) | ❌ (Base64 編碼) |
| 支援巢狀 | ❌ (慣例 key[]) | ❌ | ✅ 原生 | ✅ 原生 |
| 瀏覽器原生 | ✅ | ✅ | ✅ (AJAX) | ✅ (AJAX) |
| PHP 自動解析 | ✅ $_POST | ✅ $_POST/$_FILES | ❌ 需手動 | ❌ 需手動 |
| 除錯友好度 | 一般 | 一般 | ✅ DevTools 樹狀檢視 | 一般 |
| 傳輸體積 | 小 | 大 (boundary 開銷) | 中 | 大 (標籤冗長) |
x-www-form-urlencodedmultipart/form-data(無替代)application/json(首選)text/xml(被動適配)開發者可定義專屬 Content-Type(如 application/vnd.myapp.v1+json),配合 API 版本控管、內容協商,但需雙端協同實作解析器。