zoukankan      html  css  js  c++  java
  • [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值,都可以读取。

  • 相关阅读:
    yzoj P2344 斯卡布罗集市 题解
    yzoj P2350 逃离洞穴 题解
    yzoj P2349 取数 题解
    JXOI 2017 颜色 题解
    NOIP 2009 最优贸易 题解
    CH 4302 Interval GCD 题解
    CH4301 Can you answer on these queries III 题解
    Luogu2533[AHOI2012]信号塔
    Luogu3320[SDOI2015]寻宝游戏
    Luogu3187[HNOI2007]最小矩形覆盖
  • 原文地址:https://www.cnblogs.com/yiyide266/p/10536141.html
Copyright © 2011-2022 走看看