• php curl POST multipart/form-data与application/x-www-form-urlencode的区别【转】


    背景

    CURL在 a.php 中以 POST方式向 b.php 提交数据,但b.php无法接收到数据,而 CURL 操作显示成功。

    原来,"传递一个数组到CURLOPT_POSTFIELDS,CURL会把数据编码成 multipart/form-data,而传递一个URL-encoded字符串时,数据会被编码成 application/x-www-form-urlencoded"。但是在使用 PHP Curl进行Post时可以指定 multipart/form-data 或 application/x-www-form-urlencoded 的方法。

    验证过程

    示例:

    <?ph
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_exec($ch);
    curl_close($ch);
    

    这段代码提交的Content-Type到底是multipart/form-data还是application/x-www-form-urlencoded呢?
    tcpdump 抓包, wireshark 分析包内容,发现Content-Type的类型取决于$data的数据类型。
     
    1、如果$data是字符串,则Content-Type是application/x-www-form-urlencoded。
    HTML Form URL Encoded: application/x-www-form-urlencoded
    Form item: "uname" = "nickname"
    Key: uname
    Value: nickname
     
    2、如果$data是k=>v的数组,则Content-Type是multipart/form-data,
    set boundary
    Content-Type: multipart/form-data; boundary=----------------------------749c186646f5
     
    3、special case:
    if pass an array array('uname' => 'nickname', 'uid' => 123456789) to CURLOPT_POSTFIELDS and set the content-type:application/x-www-form-urlencode to CURLOPT_HTTPHEADER
    an unexpected result will be happened
     

    [_POST] => Array
    (
    [------------------------------635248b8d641
    Content-Disposition:_form-data;_name] => "uname"
    
    nickname
    ------------------------------635248b8d641
    Content-Disposition: form-data; name="uid"
    
    123456789
    ------------------------------635248b8d641--
    
    )
    

    总结

     
    header 可以设置对 http body data 的编码方式

     
    CURL_POST:TRUE to do a regular HTTP POST. This POST is the normal application/x-www-form-urlencoded kind, most commonly used by HTML forms.

     
    application/x-www-form-urlencoded form元素默认指定的enctype属性
    multipart/form-data 上传大量文本,包含非 ASCII字符或者二进制数据。既支持发送文本数据,也支持二进制数据上载。Browser端<form>表单的ENCTYPE属性值为multipart/form-data,它告诉我们传输的数据要用到多媒体传输协议,由于多媒体传输的都是大量的数据,所以规定上传文件必须是post方法,<input>的type属性必须是file。
     
    文章转自:https://www.cnblogs.com/brookin/p/4063545.html

  • 相关阅读:
    数据结构与算法复习(三)归并排序
    编程练习-扑克牌
    编程练习-字符串处理及简单排序
    spi驱动框架学习记录
    mt7628网口引脚设置成通用GPIO的方法
    数据结构与算法复习(二)插入排序
    数据结构与算法复习(一)快速排序
    基于input子系统的按键驱动程序
    基于设备树编写按键中断驱动程序
    Linux读写权限整理 --chmod
  • 原文地址:https://www.cnblogs.com/KillBugMe/p/13219558.html
Copyright © 2020-2023  润新知