以前面试时候,面试官问过我后端有没有跨域问题,但是不敢肯定,现在可以肯定的说没有。
不文用php的cURL和file_get_contents方法分别实现后端跨域。本文场景也是在tp5下实现的。
一,利用cURL实现
1)前端代码,这是一个页面,访问的路径为http://app.write.com/thinkphp/public/index.php/index/index/curl,模块index,控制器index,方法curl
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 ????<meta charset="UTF-8"> 5 ????<title>测试curl</title> 6 </head> 7 <body> 8 ?????9 ????<div id="test">10 ????????11 ????</div>12 ????<script type="text/javascript">13 ????????//利用原生的xml14 ????var oAjax = new XMLHttpRequest();15 ????oAjax.open(‘GET‘,"/thinkphp/public/index.php/index/index/curlApi");//前端为get请求url,不影响后端16 ????oAjax.onreadystatechange = function() {17 ????????if (oAjax.readyState == 4) {18 ????????????if (oAjax.status >= 200 && oAjax.status < 300 || oAjax.status == 304) {19 ???????????????console.log(oAjax.responseText);20 ???????????????var data=JSON.parse(oAjax.responseText);21 ???????????????document.getElementById("test").innerHTML=data.elist[0].Code;22 ????????????} else {23 ????????????????console.log(oAjax.status);24 ????????????}25 ????????}26 ????};27 ????oAjax.send();28 ????</script>29 </body>30 </html>
2)接口代码
1 ?//封装的利用curl实现的方法 2 ??????public function doCurlPostRequest($url,$requestString,$timeout = 5){ 3 ?????????if($url == ‘‘ || $requestString == ‘‘ || $timeout <=0){ 4 ???????????????return false; 5 ??????????} 6 ????????$con = curl_init((string)$url);//初始化一个cURL会话。 7 ????????//设置会话的相关选项 8 ????????curl_setopt($con, CURLOPT_HEADER, false); 9 ????????curl_setopt($con, CURLOPT_POSTFIELDS, $requestString);10 ????????curl_setopt($con, CURLOPT_POST,true);11 ????????curl_setopt($con, CURLOPT_RETURNTRANSFER,true);12 ????????curl_setopt($con, CURLOPT_TIMEOUT,(int)$timeout);13 ????????//执行一个cURL会话。14 ????????$data = curl_exec($con); ?15 ????????//关闭一个会话16 ????????curl_close($con); ?17 ????????18 ????????return $data; 19 ?????}20 ?????public function curlApi(){21 ????????//自定义参数举例22 ?????????$urlArr=[23 ????????????"pageno"=>1,24 ????????????"pagesize"=>200,25 ????????????"condstr"=>"社会大课堂:0"26 ?????????];27 ????????$post_string = http_build_query($urlArr);28 ???????29 ????????$url="跨域完整地址";30 ????????return $this->doCurlPostRequest($url,$post_string);31 ????????///return "common";32 ????}
二,利用file_get_contents实现
前端代码一致,后端对方法进行了封装
1 ??public function fileGetContent($sUrl,$data){ 2 ???????????$aContext = [ 3 ????????????‘http‘ => [ 4 ????????????????‘method‘ => ‘POST‘, 5 ????????????????‘header‘ ?=> ‘Content-type: application/x-www-form-urlencoded‘, 6 ????????????????‘content‘ => $data 7 ??????????????] 8 ??????????]; ??9 ??10 ???????$cxContext ?= stream_context_create($aContext); ?//创建并返回一个文本数据流并应用各种选项11 ???????$d = file_get_contents($sUrl,false,$cxContext); ?12 ???????return $d;13 ?????}
将上述的doCurlPostRequest方法换成fileGetContent就可以了。
当然还可以将两个方法放到common.php中直接使用。
本文结束。
cURL和file_get_contents实现模拟post请求
原文地址:https://www.cnblogs.com/zhensg123/p/9104261.html