[http] application / x-www-form-urlencoded或multipart / form-data?


Answers

至少閱讀第一部分!

我知道這已經太遲了3年,但馬特的(接受的)答案是不完整的,最終會讓你陷入困境。 這裡的關鍵在於,如果您選擇使用multipart/form-data ,則邊界不得出現在服務器最終收到的文件數據中。

這對application/x-www-form-urlencoded沒有問題,因為沒有邊界。 x-www-form-urlencoded也可以總是處理二進制數據,方法是將一個任意字節轉換為三個7BIT字節。 效率低下,但它有效(並註意關於不能發送文件名以及二進制數據的註釋不正確;您只是將它作為另一個鍵/值對發送)。

multipart/form-data的問題在於,邊界分隔符不能存在於文件數據中(參見RFC2388 ; 5.2節也包含了一個相當蹩腳的理由,因為沒有適當的聚合MIME類型來避免這個問題)。

因此,初看起來, multipart/form-data任何文件上傳,二進製或其他方面都沒有任何價值。 如果你沒有正確選擇你的邊界,那麼你最終會遇到問題,不管你是發送純文本還是原始二進製文件 - 服務器都會在錯誤的地方找到邊界,並且你的文件將被截斷,或者POST將失敗。

關鍵是選擇一個編碼和一個邊界,以便您的選定邊界字符不會出現在編碼輸出中。 一個簡單的解決方案是使用base64 (不要使用原始二進製文件)。 在base64 3個任意字節被編碼為4個7位字符,其中輸出字符集為[A-Za-z0-9+/=] (即字母數字或'+','/','=') 。 =是一種特殊情況,並且可能僅出現在編碼輸出的末尾,如單個=或雙== 。 現在,選擇你的邊界作為一個7位ASCII字符串,它不能出現在base64輸出中。 您在網絡上看到的許多選擇都無法通過此測試--MDN形成docs ,例如,在發送二進制數據時使用“blob”作為邊界 - 效果不佳。 但是,像“!blob!” 將永遠不會出現在base64輸出中。

Question

在HTTP中,有兩種​​POST數據的方式: application/x-www-form-urlencodedmultipart/form-data 。 據我所知,如果使用multipart/form-data ,大多數瀏覽器只能上傳文件。 在API上下文中使用其中一種編碼類型(不涉及瀏覽器)時是否有任何其他指導? 這可能基於:

  • 數據大小
  • 存在非ASCII字符
  • 存在於(未編碼的)二進制數據上
  • 需要傳輸額外的數據(如文件名)

我基本上沒有在網上找到關於迄今為止使用不同內容類型的正式指導。




曼努埃爾說過的我很同意。 事實上,他的評論指的是這個網址...

w3.org/TR/html401/interact/forms.html#h-17.13.4

......其中說:

內容類型“application / x-www-form-urlencoded”對於發送大量包含非ASCII字符的二進制數據或文本而言效率不高。 內容類型“multipart / form-data”應該用於提交包含文件,非ASCII數據和二進制數據的表單。

但是,對我來說,這將歸結為工具/框架支持。

  • 你期望你的API用戶使用哪些工具和框架構建應用程序?
  • 他們是否有框架或組件可以使用,而不是使用一種方法而不是另一種?

如果你清楚了解你的用戶,以及他們將如何使用你的API,那麼這將幫助你做出決定。 如果您為API用戶難以上傳文件,那麼他們會離開,您將花費大量時間來支持它們。

其次,這將是您為編寫您的API所提供的工具支持,以及您為適應一種上傳機制的容易程度。




Links