最近接了一个需求,需要在一个比较老的版本上新增请求外部接口的功能,第一个想到的是使用PHP的CURL扩展来实现,这个平时用的最多。
接下来最尴尬的事情来了,机器是不支持修改系统配置和安装其他扩展的。
于是我就尝试使用 file_get_contents
和 fopen
,也是不支持。
最后无奈之下,尝试了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进行模拟请求。