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