[HTTP]POST報文中Content-Type對正文解析的影響


概述

在POST請求中,理論上請求端程序可以發送任意格式報文正文,但是最好在報文頭Content-Type字段標明正文的格式,方便接收端根據Content-Type正確處理正文。

傳統HTML-form表單提交

html-form表單中,post正文格式被定義在enctype屬性中,該屬性一共定義了3個值,分別對應Content-Type的3個值:

enctype值 enctype描述 對應Content-Type的值 正文段格式示例
application/x-www-form-urlencoded 在發送前編碼所有字符,http_query編碼方式(默認) application/x-www-form-urlencoded manid=qwert&file-a=1ca6f20fd0c29742bec9914423140d03.jpg
multipart/form-data 不對字符編碼,正文內容是每一個表單字段進行boundary分隔組成的報文,支持二進制數據提交 multipart/form-data; boundary=XXXXXXXXXX(請求端程序自行生成的boundary) ------WebKitFormBoundaryNOdBuEzJYqyffk3l
Content-Disposition: form-data; name="manid"

qwert
------WebKitFormBoundaryNOdBuEzJYqyffk3l
Content-Disposition: form-data; name="file-a"; filename="1ca6f20fd0c29742bec9914423140d03.jpg"
Content-Type: image/jpeg

#¥%%……&%F……%

------WebKitFormBoundaryNOdBuEzJYqyffk3l--

text/plain 空格轉換為 "+" 加號,但不對特殊字符編碼 text/plain manid=qwert
file-a=1ca6f20fd0c29742bec9914423140d03.jpg

只有enctype="multipart/form-data"能夠提交form input type="file"字段選擇的文件,其余兩種編碼方式只能夠提交文件名。

 

自定義提交

發送端只需要遵循HTTP報文規范,就可以自行自定義發送post報文,這跟是否帶有Content-Type無關,但是接收端也要自定義解析規則,如果是通用的解析規則,通常只能支持規范中的Content-Type類型解析。

PHP

PHP自帶的報文解析只支持html form enctype原生的前2種解析方式("application/x-www-form-urlencoded","multipart/form-data"),通常字符類型的字段解析到全局變量$_POST中,二進制內容解析到全局變量$_FILES中。

也可以運用自帶封裝協議"php://input"讀取請求正文,但是當enctype="multipart/form-data"的情況下,這種方式是無效的,其余情況,包括自定義的Content-Type值,都可以讀取。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM