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

    本文结束。

  • 相关阅读:
    安装wampserver时提示丢失MSVCR110.dll(在windows server上可用)
    前端开发必备!Emmet使用手册
    Markdown 新手指南
    封装系统(以封装Windows 7为例)
    简体中国版文档的Markdown语法
    sublime text 3 快捷键大全以及配置编译环境
    windows下的命令行工具babun
    Android屏幕适配全攻略(最权威的官方适配指导)
    JMETER第五节课jenkis集成常态化压测的实战?主从压力机实战??
    性能测试5--Jmeter命令行与以及普罗米修斯的原理
  • 原文地址:https://www.cnblogs.com/zhensg123/p/9104261.html
Copyright © 2020-2023  润新知