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

最近接了一个需求,需要在一个比较老的版本上新增请求外部接口的功能,第一个想到的是使用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

';
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 '';

使用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扩展/方法请求外部接口)