php中curl库相关操作

最近在开发中有用到php的curl库来传递和接收http消息,因为并不擅长php,所以走了很多弯路,在这里归纳一下,如有错误,欢迎指正

1.HTTP会话的结构##

Method URL Version

Hearder

Data

2.用到的相关函数含义##

$ch = curl_init();   //初始化一个curl会话
curl_setopt();   //设置curl传输选项
curl_setopt($ch, CURLOPT_URL, $url);   //设置抓取的url
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   //设置获取的信息以文件流的形式返回,而不是直接输出

下面6行为一组 $cacert = "/path/to/client.crt"; $key = "/path/to/client.key"; curl_setopt($ch, CURLOPT_SSLCERT, $cacert);   //指定客户端证书,用于https curl_setopt($ch, CURLOPT_SSLKEY, $key);   //指定客户端秘钥 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);   //与下一句合用,绕过ssl验证 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_HTTPGET, true);   //设置传输方式为get,其实默认也为get,可以在方式改变的时候设置 curl_setopt($ch, CURLOPT_POST, 1);   //设置传输方式为post curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));   //用post方式传输Body内容为data的消息,get类似 $output = curl_exec($ch);   //执行curl会话,获得返回的结果 curl_errno($ch);   //返回一个包含当前会话错误信息的字符串 curl_close($ch);   //关闭curl请求 print_r($output);   //打印获取的数据

3.封装Header数据和Data数据并进行传送##

(1) Header封装
$accessToken = "+++++++";
$app_key = "+++++++";
$header = array("Content-Type: application/json","Authorization: bearer $accessToken","app_key: $app_key");
curl_setopt($ch,CURLOPT_HTTPHEADER,$header);   //为url添加hearder

(2) Data封装

如果Hearder的Content-type:application/x-www-form-urlencoded,则Data如下封装 $data = Array ("deviceId" => "$deviceId", "gatewayId" => "$deviceId"); $data = http_build_query($data);     //Data需要经过该函数处理 curl_setopt($ch, CURLOPT_URL, $url.$data);   //http用get方式传送带data的url curl_setopt($ch, CURLOPT_POSTFIELDS, $data);   //http用post方式传送带data的url
如果Hearder的Content-type:application/json,则Data如下封装 $data = '{"notifyType":"deviceAdded","callbackurl":"https://192.168.1.1:443/test/a.php"}' ;   //Data不需要函数处理 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);   //http用post方式传送json格式data的url

4.php接收不同格式的post消息##

(1) 如果接收的消息为Content-type:application/x-www-form-urlencoded类型
$post_data = $_POST;   //$post_data为数组,可直接取元素的值,如$post_data['id']

(2) 如果接收的消息为Content-type:application/json类型
$raw_post_data = file_get_contents("php://input");   //&raw_post_data为json格式,需要用json_decode函数处理
$raw_post_data = json_decode($raw_post_data,true);   //处理后$raw_post_data为数组,可以直接取元素的值

注意:
如果要将接收的数据写入txt文件中,需转化为是json格式的数据,则 1 中的$post_data需用json_encode处理,2中的$raw_post_data不需要用json_decode处理
$post_data=json_encode($post_data);   //转成json格式
file = fopen("test.txt","w");   //打开txt文件
$fwrite($file,$post_data);   //将数据写入文件

5.附上代码##

(1)post方式:


 "++++++++++++++++",
                                "secret" => "++++++++++++++++"
                        );
                curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
                $output = curl_exec($ch);          
                if (curl_errno($ch)) {
                        echo 'Errno'.curl_error($ch);
                }
                curl_close($ch);
                print_r($output);
?>

(2)get方式:

 "$deviceId",
                        "gatewayId" => "$deviceId"
                );
		$data = http_build_query($data);		
		curl_setopt($ch, CURLOPT_HTTPGET, true);
                curl_setopt($ch, CURLOPT_URL, $url.$data);
                $output = curl_exec($ch);
                if (curl_errno($ch)) {
                        echo 'Errno'.curl_error($ch);
                }
                curl_close($ch);
                print_r($output);
?>
原文地址:https://www.cnblogs.com/yf4695/p/8999829.html