前言
由于项目需要,需要在项目中搭建一套接口,但是实际操作的时候发现自己对于curl了解甚少,当时能随手打出的估计也就只有在服务器上debug时使用curl本地连接排查问题了(笑)
闲话少说,就直接进入正题了,首先知物需要知底,那么就从起源开始查起吧。(格物致知嘛,(笑))
CURL的起源
博主查了一下,嗯。。。。赫然发现这个起源,我没有找到小故事。。。或者说这个东西是基石,没有什么为什么。。。这个小结跳过。。。
这个博文是半年之前写的,然后到今天,又有一个需求接到手的时候,我依然决然地再次在相同问题上踩了坑,所以现在痛定思非,必须总结一下自己踩过的坑(ps:其实也不算坑,只是自己一方面对网络请求协议的不熟悉,一方面被相关接口单位的这个数据格式校验打的头皮发麻,当然还有一部分原因在于这个公司文档,嗯,全英文,然后还写的部分参数不对。。。当然最主要原因还是自己看文档不仔细,没想好就岔开步子往前迈。。)
CURL的常用命令
curl众所周知是基石(我就是不害臊,现学现用),那么他的命令也是有很多,常用的有这么几个函数,首先是/。。。。
对,没错,上面就是我几个月前写的博客放在草稿箱里面吃灰,嗯。。。就是要亮出来,让自己害臊。。。
闲话少说,我来总结一下自己对curl这个工具使用的总结
总体来讲分为这几步:
一、curl_init() 初始化工具
二、curl_setopt() 设置请求
三、curl_exec() 执行工具
四、curl_close() 关闭句柄
而我们通常使用最多就是在第二步,而理解难度,或者说理解深度重头都在这个第二步,如何设置请求,怎么写请求,这就要求你要对相关的网络协议的理解和应用,而这一部分也恰恰是我所欠缺的。就比如说请求头有那些行?。。。好吧,这个只要知道经常使用的几部分就可以了
如图,当然这些只是一小部分,更多主要在于这个用的频率上,我这边就不扩展地去写了,反正写太多又会倦怠。。。。
那么我就拿经常使用的restfulApi的封装以及不同格式的数据的上传来具体记录一下自己所遇到的一些问题。
首先这个restfulApi我们知道是将请求按照不同的方式来进行划分,有delete、put、get、post等,那么不同的请求我们通常以CURLOPT_CUSTOMREQUEST这个选项进行设置
curl_setopt($url,CURLOPT_CUSTOMREQUEST, $method)
这个就简单明了了,我这边就不阐释 了。。。
那么这个数据要怎么传呢?
get方式就不说了。。。那么以post为例,如何传递不同的数据格式呢?
比如说json格式/x-www-form-urlencode格式,嗯,这两个我是经常遇到的,所以就先记录一下,以后遇到其他的再写(牛气)
首先说json格式,这要求我们这样写,即把请求头按照这样格式声明
'Content-Type: application/json',
'Content-Length: ' . strlen($data)
嗯,就是这样,具体原因待查。。。
另一个就简单多了。。。或者说熟练多了。。这两个是基础中的基础,打扰了,大佬
Content-Type: application/x-www-form-urlencoded
然后这些信息以数组形式保存,然后写入到这次请求的请求头
即用到了这个参数CURLOPT_HTTPHEADER
语义化你懂不懂?
//代码如下
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
下来贴个自己封装的curl的函数,仅供记录。。毕竟很菜
public static function curl($url, $header = null, $data = null, $method = 'post')
{
//初始化curl
$curl = curl_init();
//设置请求头
if (is_array($header)) {
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//不输出内容
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);//https请求不验证host和证书
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);//设置请求类型
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);//传递数据
//获取采集结果
$output = curl_exec($curl);
//关闭cURL链接
curl_close($curl);
//解析json
$json = json_decode($output, true);
//判断json还是xml
if ($json) {
return $json;
} else {
#验证xml
libxml_disable_entity_loader(true);//禁止加载外部实体
#解析xml
$xml = simplexml_load_string($output, 'SimpleXMLElement', LIBXML_NOCDATA);
return $xml;
}
}
特别表明一下,如果curl返回的结果一直是false,但是命令行使用却正常的话,需要从以下几个角度去分析和判断:
一、是否是ssl证书的事情
比如无法验证ssl证书,选项CURLOPT_SSL_VERIFYPEER
二、可以用curl工具中的调试工具进行排查
命令curl_error($ch);浪费了半小时在搞这个玩意儿,真的烦。。。。。