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值,都可以读取。

  • 相关阅读:
    【分享】项目开发容易出现的问题?身为前端/后端你见到过吗?
    标准化API设计的重要性
    【分享】对外API接口安全设计
    【实例】调用数据库自动生成接口代码
    【翻译】API-First是什么概念?有什么商业价值?
    保障接口安全的5种常见方式
    【翻译】使用OpenAPI规范进行安全的API设计
    为什么需要API文档
    利用java的反射,实现工厂创建对象
    Cesium入门8
  • 原文地址:https://www.cnblogs.com/yiyide266/p/10536141.html
Copyright © 2011-2022 走看看