cURL和file_get_contents实现模拟post请求

以前面试时候,面试官问过我后端有没有跨域问题,但是不敢肯定,现在可以肯定的说没有。

不文用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中直接使用。

本文结束。

猜你喜欢

转载自www.cnblogs.com/zhensg123/p/9104261.html