http請求頭中application/x-www-form-urlencoded和multipart/form-data區別

zhenjingcool發表於2024-04-17

application/x-www-form-urlencoded和multipart/form-data是兩種不同的 Content-Type,它們在網路請求中(尤其是 POST 請求)用來指定表單資料的編碼格式

application/x-www-form-urlencoded:
• 這是最常見的表單資料編碼方式,也是 HTML 表單的預設編碼型別。
• 所有表單欄位名和值都會進行 URL 編碼(即百分號編碼),然後透過 "&" 符號連線起來形成一個長字串。
• 它不適用於傳輸二進位制資料,例如檔案上傳,因為所有資料都被轉換成了 ASCII 文字格式。
• 資料量有限制,因為在 URL 中可能會遇到長度限制,並且不能很好地處理大資料或特殊字元。

報文格式:

POST /submit-form HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 60

username=admin&password=secretpassword&message=Hello%20World&isAgreed=true

multipart/form-data:
• 這種編碼方式主要用於需要上傳檔案的表單場景。
• 每個表單欄位都在訊息正文中作為一個單獨的部分(part),每個部分有自己的“Content-Disposition”頭,用於描述欄位名和檔名(如果適用的話)。
• 不會對欄位名和值進行 URL 編碼,而是保持原始資料格式,特別適合傳輸二進位制檔案資料。
• 可以同時上傳文字欄位和檔案,每一個部分之間用邊界字串分隔開來,便於伺服器解析各個欄位內容。
• 不受 URL 長度限制,能上傳較大的資料塊。

報文格式

POST /upload-form HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Length: .jpg

------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="example.jpg"
Content-Type: image/jpeg

<binary data of the image file>

------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="description"

This is an example image.
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

總結起來,在選擇表單資料編碼格式時,如果只是提交簡單的鍵值對且不包含檔案,一般使用application/x-www-form-urlencoded;而如果有檔案上傳或者其他複雜資料結構需要保持原樣傳輸,則使用multipart/form-data

相關文章