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方式:


<?php
$ch = curl_init();
$cacert = "/path/to/client.crt";
$key = "/path/to/client.key";
$url = "https://192.168.1.1:443/login";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSLCERT, $cacert);
curl_setopt($ch, CURLOPT_SSLKEY, $key);
curl_setopt($ch, CURLOPT_POST, 1);
$post_data = Array
(
"appId" => "++++++++++++++++",
"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方式:

<?php
$ch = curl_init();
$cacert = "/path/to/client.crt";
$key = "/path/to/client.key";
$accessToken = "+++++++++++++++++++";
$deviceId = "+++++++++++++++++++";
&app_key = "+++++++++++++++++";
$url = "https://192.168.1.1:443/deviceData";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSLCERT, $cacert);
curl_setopt($ch, CURLOPT_SSLKEY, $key);
$header = array("Content-Type: application/json","Authorization: bearer $accessToken","app_key: &app_key");
curl_setopt($ch,CURLOPT_HTTPHEADER,$header);
$data = Array
(
"deviceId" => "$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);
?>

猜你喜欢

转载自www.cnblogs.com/yf4695/p/8999829.html