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

 

原文地址:https://www.cnblogs.com/murong/p/8532058.html