zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    云计算是什么?它有哪些形式?
    TensorFlow从0到1之浅谈深度学习(5)
    excel如何快速统计出某一分类的最大值?
    Excel怎样根据出生日期,快速计算出其年龄呢?
    Excel只想显示一部分日期,怎样把其余部分隐藏起来?
    Excel数据透视表的日常应用技巧
    人工智能(机器学习)学习之路推荐
    人工智能之常用数据结构与算法(python)
    excel如何快速计算日期对应的生肖?
    excel 如何制作带下拉框的动态折线图表
  • 原文地址:https://www.cnblogs.com/KillBugMe/p/13219558.html
Copyright © 2011-2022 走看看