亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

應用程序/x-www-表單-urlencode還是多部分/表單-數據?

應用程序/x-www-表單-urlencode還是多部分/表單-數據?

慕少森 2019-06-03 14:51:57
應用程序/x-www-表單-urlencode還是多部分/表單-數據?在HTTP中,有兩種發布數據的方法:application/x-www-form-urlencoded和multipart/form-data..據我所知,大多數瀏覽器只能在以下情況下才能上傳文件multipart/form-data被利用了。在API上下文中使用其中一種編碼類型(不涉及瀏覽器)時,是否有其他指導?例如,這可能是基于:數據大小非ASCII字符的存在性(未編碼的)二進制數據的存在需要傳輸其他數據(如文件名)到目前為止,我基本上沒有在網絡上找到關于使用不同內容類型的正式指南。
查看完整描述

3 回答

?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

TL;DR

摘要;如果要傳輸二進制(非字母數字)數據(或相當大的有效負載),請使用multipart/form-data..否則,使用application/x-www-form-urlencoded.


你提到的啞劇類型有兩種Content-Type用戶代理(瀏覽器)必須支持的HTTPPOST請求的頭。這兩種類型請求的目的是向服務器發送名稱/值對的列表。根據所傳輸數據的類型和數量,其中一種方法比另一種方法更有效。要理解其中的原因,你必須看看每個人都在做些什么。

application/x-www-form-urlencoded,發送給服務器的HTTP消息的主體本質上是一個巨大的查詢字符串-名稱/值對由符號和(&),并且名稱與值由相等符號(=)。這方面的一個例子是:

MyVariableOne=ValueOne&MyVariableTwo=ValueTwo

根據規格:

[保留和]非字母數字字符替換為‘%hh’,一個百分比符號和兩個十六進制數字,表示字符的ASCII代碼。

這意味著,對于我們的一個值中存在的每個非字母數字字節,它將花費三個字節來表示它。對于大型二進制文件,將有效負載增加三倍將是非常低效的。

在那里multipart/form-data進來。使用這種傳遞名稱/值對的方法,每對都表示為MIME消息中的“部件”(如其他答案所述)。各個部分由一個特定的字符串邊界分隔(特別選擇這個邊界字符串,使這個邊界字符串不會出現在任何“值”有效載荷中)。每個部分都有自己的一組MIME標頭,如下所示Content-Type,特別是Content-Disposition,它可以賦予每個部分“名稱”。每個名稱/值對的值段是MIME消息的每個部分的有效負載。MIME規范在表示值有效負載時給了我們更多的選擇-我們可以選擇更有效的二進制數據編碼來節省帶寬(例如,基本64甚至原始二進制)。

為什么不使用multipart/form-data一直?簡而言之,字母數字值(和大多數Web表單一樣),添加所有MIME頭的開銷將大大超過更有效的二進制編碼節省的費用。


查看完整回答
反對 回復 2019-06-03
?
斯蒂芬大帝

TA貢獻1827條經驗 獲得超8個贊

至少在這里讀第一段!

我知道這已經晚了3年了,但馬特(接受)的答案是不完整的,最終會給你帶來麻煩。這里的關鍵是,如果你選擇使用multipart/form-data,邊界必須顯示在服務器最終接收的文件數據中。

這不是問題application/x-www-form-urlencoded因為沒有邊界。x-www-form-urlencoded也可以隨時處理二進制數據,通過簡單的權宜之計將一個任意字節轉換為三個。7BIT字節。效率低下,但它有效(請注意,關于不能發送文件名和二進制數據的注釋是不正確的;您只需將其作為另一個鍵/值對發送)。

與.有關的問題multipart/form-data邊界分隔符不能出現在文件數據中(請參見RFC 2388第5.2節還包括一個相當站不住腳的借口,認為沒有適當的聚合MIME類型可以避免這個問題)。

所以,乍一看,multipart/form-data毫無價值任何文件上傳,二進制或其他。如果你沒有正確選擇你的邊界,那么你將要最終會出現問題,無論您是發送純文本還是原始二進制文件-服務器將在錯誤的位置找到一個邊界,您的文件將被截斷,或者POST將失敗。

關鍵是選擇編碼和邊界,以便所選邊界字符不能出現在編碼輸出中。一個簡單的解決方案是使用base64(做使用原始二進制)。在……里面基準643個任意字節被編碼為4個7位字符,其中輸出字符集為[A-Za-z0-9+/=](即字母數字、‘+’、‘/’或‘=’)。=是一種特例,并且只能在編碼輸出的末尾以單一形式出現。=或者雙份==..現在,選擇您的邊界作為一個7位的ASCII字符串,它不能出現在base64輸出。您在網絡上看到的許多選擇都失敗了-mdn表單。博士例如,在發送二進制數據時,使用“BLOB”作為邊界-這不太好。然而,就像“!BLOB!”永遠不會出現在base64輸出。


查看完整回答
反對 回復 2019-06-03
  • 3 回答
  • 0 關注
  • 824 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號