• PHP里使用CURL请求数据 关于 设置Content-Typ的一个问题


          

        过完年,换了个公司,刚到公司第一个星期就发了红包,心里美美哒 ,感觉这家公司的老板很有人情味,而且公司里面美女一个比一个美 ,关键还都是老司机, 天天小火车呜呜呜,听得 我都觉得年轻了好几岁,仿佛又回到了那个满满荷尔蒙的年纪。。

        说正事 ,老大交给 我一个任务:和一个第三方平台联调一个接口。 心里想这都是 小case; 我的扣扣被拉进了一个讨论组,确认对接人之后,我开始看文档,看代码接口,还有一个demo 样板;

        问题是这样的: 一个合作的第三方平台使用 php 语言  发起一个post 请求,一直没有数据返回,报错的主要内容是超时;

    <?php  
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://dwz.cn/create.php");
    curl_setopt($ch, CURLOPT_POST,true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
    
    $data = array('url'=>'http://www.baidu.com/');
    //$data = http_build_query($data); //建议加上,否则使用multipart/form-data类型
    
    curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
    
    $strRes = curl_exec($ch);
    curl_close($ch);
    
    $arrResponse=json_decode($strRes, true);
    if($arrResponse['status'] != 0){
        echo $arrResponse['err_msg']."
    ";
    }
    
    echo $arrResponse['tinyurl']."
    ";

    这里的$data = http_build_query($data)

    最终我们通过$_POST读取到数据。

    http_build_query作用就是把参数转成URL-encode 之后的请求字符串,这个和application/x-www-form-urlencoded方式是一致的。

    为什么不使用http_build_query方法也可以使用$_POST获取到数据呢?

      使用数组提供 post 数据时,CURL 组件大概是为了兼容 @filename 这种上传文件的写法,默认把Content-Type 设为了multipart/form-data。虽然对于大多数服务器并没有影响,但是还是有少部分服务器不兼容。

    PHP参考手册里介绍curl_setopt时说道:

    CURLOPT_POSTFIELDS
    全部数据使用HTTP协议中的"POST"操作来发送。要发送文件,在文件名前面加上@前缀并使用完整路径。这个参数可以通过urlencoded后的字符串类似'para1=val1&para2=val2&...'或使用一个以字段名为键值,字段数据为值的数组。如果value是一个数组,Content-Type头将会被设置成multipart/form-data。

        传递一个数组到 CURLOPT_POSTFIELDS ,cURL会把数据编码成 multipart/form-data,而然传递一个URL-encoded字符串时,数据会被编码成 application/x-www-form-urlencoded。

    总结:
      使用 CURL 并且参数为数据时,向服务器提交数据的时候,HTTP头会发送Content_type: application/x-www-form-urlencoded。这个是正常的网页<form>提交表单时,浏览器发送的头部。而 multipart/form-data 我们知道这是用于上传文件的表单。包括了 boundary 分界符,会多出很多字节。在没有需要上传文件的情况下,尽量对 post 提交的数据进行 http_build_query 处理,然后再发送出去,能实现更好的兼容性,更小的请求数据包

    参考资料:http://www.cnblogs.com/52fhy/p/5436673.html

     

  • 相关阅读:
    SQL Server中的执行引擎入门
    SQL Server复制入门(一)复制简介
    Django 代码片断收集(持续更新)
    今天思路有点乱,随便记一点关于 xmlrpc 的
    PIL 学习笔记(1)
    Django newforms
    在 Django 的 View 中利用 function decorator 可实现一定程度的代码重用
    今天在 Linux 上顺利编译 PIL 1.1.6 成功
    用 PIL 写了个简单的缩略图生成程序
    [转贴] 中药内外合治急慢性鼻窦炎
  • 原文地址:https://www.cnblogs.com/murong/p/8532058.html
Copyright © 2020-2023  润新知