以前面试时候,面试官问过我后端有没有跨域问题,但是不敢肯定,现在可以肯定的说没有。
不文用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 //利用原生的xml 14 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中直接使用。
本文结束。