在 Web 開發中,POST 請求是向伺服器提交數據的核心手段。HTTP/1.1 協議雖然規定了 POST 方法,但並未強制規範消息主體的編碼格式,這賦予了開發者極大的靈活性。然而,為了讓伺服端能正確解析數據,雙方必須遵循共同的約定。本文將系統梳理四種最主流的 POST 數據提交方式,解析其原理、適用場景及優缺點。
HTTP 請求由三部分組成:狀態行、請求頭、消息主體。POST 數據必須放在消息主體中,而伺服端通過請求頭中的 Content-Type 字段判斷主體的編碼方式,進而選擇正確的解析策略。因此,POST 提交方案的核心在於 Content-Type 與消息主體格式的配合。
這是瀏覽器原生 <form> 表單的默認提交方式(未設置 enctype 時)。數據以 key1=value1&key2=value2 形式編碼,鍵值均經 URL 編碼。
POST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded;charset=utf-8
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
特點:
局限:無法直接傳輸複雜的巢狀結構或二進制文件。
當表單包含文件上傳時,必須設置 enctype="multipart/form-data"。請求主體通過 boundary 分隔符將不同字段分割,每個部分獨立包含內容描述(如 Content-Disposition、Content-Type)與實際數據(文本或二進制)。
POST / HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"
title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png
PNG ... binary content ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
優勢:原生支持文件上傳、混合傳輸文本與二進制數據,各主流後端框架均提供成熟解析中間件。
隨著前後端分離與 RESTful 架構普及,JSON 成為數據交換的事實標準。前端通過 JSON.stringify() 序列化複雜對象,後端讀取原始輸入流(如 PHP 的 php://input)反序列化。
POST / HTTP/1.1
Content-Type: application/json;charset=utf-8
{"title":"test","sub":[1,2,3]}
亮點:
注意:PHP $_POST 無法自動解析此格式,需手動處理 php://input;部分舊版框架需額外配置中間件。
XML-RPC 協議以 XML 編碼遠程調用參數,曾廣泛應用於 WordPress API、搜尋引擎 Ping 服務等場景。結構嚴謹但冗長,解析開銷大。
POST / HTTP/1.1
Content-Type: text/xml
examples.getStateName
41
現狀:JSON 因輕量、易讀、原生 JS 支持已全面取代 XML-RPC,僅在維護老舊系統時遇到。
| 場景 | 推薦方式 | 理由 |
|---|---|---|
| 傳統表單、簡單鍵值對 | application/x-www-form-urlencoded | 瀏覽器原生、零配置、兼容性最佳 |
| 文件上傳、混合數據 | multipart/form-data | 唯一原生支持二進制文件的標準方式 |
| 前後端分離、RESTful API、複雜結構 | application/json | 結構豐富、生態完善、調試友好 |
| 對接老舊 XML-RPC 服務 | text/xml | 被動兼容,新項目不建議 |
理解這四種方式的本質差異,能幫助你在架構設計、接口開發、問題排查時做出最優決策。