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。

  • 相关阅读:
    python json模块出现Invalid control character这个异常的原因
    KMS服务,使用命令激活windows/office
    vscode Python文件头部信息
    MIMIC-III Clinical Database 翻译
    autohotkey 设置
    DeepLearning 写代码常用
    VScode 个人设置
    随机种子设置
    samba配置
    jieba 分词不显示日志
  • 原文地址:https://www.cnblogs.com/brookin/p/4063545.html
Copyright © 2011-2022 走看看