zoukankan      html  css  js  c++  java
  • 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);
    ?>
    
  • 相关阅读:
    使用阿里云接口进行银行卡四要素实名认证
    使用阿里云接口进行银行卡三要素实名认证(阿里云api接口java)
    如何使用阿里云进行人脸和身份证头像验证比对(人证核验接口API)--java
    PHP语言对用户输入的身份证信息进行实名认证(api接口)
    Python 语言如何对身份证真实性进行实名认证(api接口)
    如何对网站用户进行实名认证
    PLSQL Developer 连接oracle(64)(instantclient_32)
    struts2的防止表单重复提交
    JSP静态化(伪静态)
    Jmeter中压力测试带验证码的登录功能
  • 原文地址:https://www.cnblogs.com/yf4695/p/8999829.html
Copyright © 2011-2022 走看看