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

     

  • 相关阅读:
    PHP 开发 APP 接口 学习笔记与总结
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 41 缺失的第一个正数
    Java实现 LeetCode 41 缺失的第一个正数
    Java实现 LeetCode 41 缺失的第一个正数
  • 原文地址:https://www.cnblogs.com/murong/p/8532058.html
Copyright © 2011-2022 走看看