美文网首页PHP学习笔记
PHP学习笔记-非PHP扩展/方法请求外部接口

PHP学习笔记-非PHP扩展/方法请求外部接口

作者: 赵客缦胡缨v吴钩霜雪明 | 来源:发表于2020-06-16 15:34 被阅读0次

    最近接了一个需求,需要在一个比较老的版本上新增请求外部接口的功能,第一个想到的是使用PHP的CURL扩展来实现,这个平时用的最多。

    接下来最尴尬的事情来了,机器是不支持修改系统配置和安装其他扩展的。

    于是我就尝试使用 file_get_contentsfopen,也是不支持。

    最后无奈之下,尝试了PHP内嵌Js和使用exec执行Linux命令来实现需求。(路过的小伙伴如果有更好的方案,可以在评论区告诉我 Thanks♪(・ω・)ノ)

       /**
         * 请求API接口-curl
         *
         * @param $url
         * @param string $way
         * @return mixed
         */
        private function getApiDataByCurl($url, $way = 'false')
        {
            $ch = curl_init();
            //设置选项,包括URL
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_POST, $way); //post提交方式
            //执行并获取HTML文档内容
            $output = curl_exec($ch);
            //释放curl句柄
            curl_close($ch);
            //转换json数据
            $data = json_decode($output, true);
            //返回数据
            return $data;
        }
    
     /**
         * 请求API接口-file_get_content
         *
         * @param string $url 请求地址
         * @param array $data 数据
         * @param array $method 请求类型
         * @return string
         */
        function getApiDataByFile($url, $data = [], $method = 'GET')
        {
            if ($method == 'POST') {
                $postdata = http_build_query($data);
                $options = array(
                    'http' => array(
                        'method' => 'POST',
                        'header' => 'Content-type:application/x-www-form-urlencoded',
                        'content' => $postdata,
                        'timeout' => 15 * 60 // 超时时间(单位:s)
                    )
                );
                $context = stream_context_create($options);
                $result = file_get_contents($url, false, $context);
            } else {
                $result = file_get_contents($url);
            }
            return $result;
        }
    
        /**
         * 请求API接口-fopen
         *
         * @param $url
         * @return string
         */
        private function getApiDataByFopen($url)
        {
            //r标识read,即标识只读
            $fp = fopen($url, 'r');
            stream_get_meta_data($fp);
            $body = '';
            while (!feof($fp)) {
                $body .= fgets($fp, 1024);
            }
            return $body;
            fclose($fp);
        } 
    

    使用PHP内嵌Js

    <?php
    echo '<script type="text/javascript">';
    echo 'var btn=document.getElementById("btn")';
    echo 'btn.=function(){
                var xhr=null;
                try{
                xhr=new XMLHttpRequest();
                }catch(e){
                xhr=new ActiveXObject("Microsoft.XMLHTTP");
                }';
    echo 'var Url = "https://xxx.com/cas/login" ';
    echo 'xhr.open("get","Url");';
    echo 'xhr.send();';
    echo 'xhr.onreadystatechange=function(){
                    if(xhr.readyState==4){
                        if(xhr.status==200){
                        document.write(xhr.responseText)
                        }else{
                        alert("error"+xhr.status)
                        }
                    }
                }
            }';
    echo '</script>';
    

    使用exec()执行Linux命令

    1. GET请求

    Curl
    curl "http://www.baidu.com"  如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地
    curl -i "http://www.baidu.com"  显示全部信息
    curl -I "http://www.baidu.com"  只显示头部信息
    curl -v "http://www.baidu.com"   显示get请求全过程解析
    

    curl命令模拟Get请求携带参数(linux):

    curl -v http://127.0.0.1:80/xcloud/test?version=1&client_version=1.1.0&seq=1001&host=aaa.com
    

    上述命令在linux系统,get请求携带的参数只到version=1,”&”符号在linux系统中为后台运行的操作符,此处需要使用反斜杠”\”转义,即:

    curl -v http://127.0.0.1:80/xcloud/test?version=1\&client_version=1.1.0\&seq=1001\&host=aaa.com
    

    或者

    curl -v "http://127.0.0.1:80/xcloud/test?version=1&client_version=1.1.0&seq=1001&host=aaa.com"
    
    Wget
    wget  "http://www.baidu.com"
    

    2. POST请求

    Curl

    使用curl命令,通过-d参数,把访问参数放在里面,如果没有参数,则不需要-d,

    curl -d "username=user1&password=123" "www.test.com/login"
    
    Wget
    wget –post-data 'username=user1&password=123' http://www.baidu.com
    
    发送格式化json请求
    curl -i -k  -H "Content-type: application/json" -X POST -d '{"version":"6.6.0", "from":"mu", "product_version":"1.1.1.0"}' https://10.10.10.10:80/test
    

    Curl和Wget区别

    Curl模拟的访问请求一般直接在控制台显示,而Wget则把结果保存为一个文件。

    如果结果内容比较少,需要直接看到结果可以考虑使用curl进行模拟请求,如果返回结果比较多,则可考虑wget进行模拟请求。

    相关文章

      网友评论

        本文标题:PHP学习笔记-非PHP扩展/方法请求外部接口

        本文链接:https://www.haomeiwen.com/subject/mlcrxktx.html