• PHP跨域请求nodejs


      摘要:用nodejs作为服务器,php作为客服端进行跨域请求,并返回数据。

      一:windows环境下的nodejs安装(以及express模板的安装):http://blog.uifanr.com/2013/03/12/472

                           http://www.veryhuo.com/a/view/39756.html

      二:测试安装

        1:在cmd中输入:node -v 若出现版本号,则安装成功。

        2:在D 盘下新建一个文件  test_node.js :

     1 var http = require("http"); 
     2 
     3 http.createServer(function(request, response) { 
     4 
     5 response.writeHead(200, {"Content-Type": 'application/json;charset=UTF-8'}); 
     6 
     7 response.write("hello"); 
     8 
     9 response.end(); 
    10 
    11 }).listen(8899); 
    12 
    13 console.log("nodejs start listen 8899 port!");
    View Code

               3:在 cmd 中进入D 盘;运行  node test_node.js。 出现:  。   打开浏览器,输入   http://127.0.0.1:8899  会出现   hello

      三:PHP跨域请求 nodejs  服务:

        1: 在D盘下新建一个文件夹 node,在 cmd 中进入 D:/node/  文件夹下新建项目:

                      

        其中 node_modules 文件夹通过node引入:  在终端进入 D: ode odejs-demo 文件夹下  npm install express ,将会在该文件夹下建立node_modules,并在

        其中引入 express模板,再引入一个模板  :npm install ejs  ,将会在node_modules文件夹下引入 ejs 模板。框架大体就搭建好了。

        2:routes 文件夹下新建一个 js 文件,services.js  :

     1 exports.index = function (req, res) {
     2     var params = req.params;//得到3000:后的 shows。  
     3     switch (params[0]) {
     4         case 'shows':
     5             shows(req, res);
     6             break;
     7         case 'select':
     8           //  selects(req, res);
     9             break;
    10     }
    11 };
    12 
    13 var shows = function (req, res) {
    14     var msg = req.headers.num;//得到
    15     var val = req.headers.val
    16     res.setHeader('Content-Type', 'application/json;charset=UTF-8');
    17     res.send({
    18         'status': 1,
    19         'data': " hellow.date: " + val,
    20         'url': " hellow.URL: " + msg,
    21     });
    22     res.end();
    23 };
    View Code

      其中 req 为请求数据,req.params 得到请求的第一个参数(app.js有配置),req.headers.num  得到客户端 请求的num 参数。

               3:配置 app.js  :

     1 var express = require('express');
     2 var routes = require('./routes');
     3 var user = require('./routes/user');
     4 var services = require('./routes/services');
     5 var http = require('http');
     6 var path = require('path');
     7 
     8 var app = express();
     9 
    10 // all environments
    11 app.set('port', process.env.PORT || 3000);
    12 app.set('views', path.join(__dirname, 'views'));
    13 app.set('view engine', 'ejs');
    14 app.use(express.favicon());
    15 app.use(express.logger('dev'));
    16 app.use(express.json());
    17 app.use(express.urlencoded());
    18 app.use(express.methodOverride());
    19 app.use(app.router);
    20 app.use(express.static(path.join(__dirname, 'public')));
    21 
    22 // development only
    23 if ('development' == app.get('env')) {
    24   app.use(express.errorHandler());
    25 }
    26 
    27 app.get('/', routes.index);
    28 app.get('/users', user.list);
    29 
    30 app.get('/service/*', services.index);
    31 app.post('/service/*', services.index);
    32 
    33 
    34 http.createServer(app).listen(app.get('port'), function(){
    35   console.log('Express server listening on port ' + app.get('port'));
    36 });

      通过引入添加的app.js 很多都已经配置好了,只需要添加你自己的 js 文件路径:./routes/services 即是刚才新建的 js 文件。 app.get 和app.post 分别接收get传值和post传值。

    在 app.get('/service/*', services.index); 中 services.index 指向 services.js 文件中的 exports.index = function (req, res){} 函数。到此,服务端就算配置好了。

      4:进入admin 文件夹中 新建 cenlent.php 文件,作为请求代理:

     1 <?php 
     2     
     3     $value = $_POST["values"];
     4     $url = $_GET["url"];
     5     
     6     $heads = array (
     7         'val:' . $value,
     8         'num:'.$url,
     9     );
    10 
    11     //$fields = array(
    12     //    'vals:'.'中心'
    13     //);
    14     
    15     $ch = curl_init ();
    16     // 设置选项,包括URL
    17     curl_setopt ( $ch, CURLOPT_URL, $url );
    18     curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
    19     curl_setopt ( $ch, CURLOPT_HEADER, 0 );
    20     curl_setopt ( $ch, CURLOPT_HTTPHEADER, $heads);
    21     curl_setopt ( $ch, CURLOPT_TIMEOUT, 5 ); // 定义超时5秒钟
    22     //curl_setopt ( $ch, CURLOPT_POST, 1 ); // POST数据
    23     //curl_setopt ( $ch, CURLOPT_POSTFIELDS, $fields ); // 把post的变量加上
    24 
    25     $result = curl_exec ( $ch );
    26     curl_close ( $ch );    
    27     if($result != null){
    28         $results=array(
    29             'status'=>1,
    30             'data' => $result
    31         );
    32     }else{
    33         $results=array(
    34             'status'=> -1,
    35             'info' => '服务器错误'
    36         );
    37     }
    38     header ( 'Content-Type:application/json; charset=utf-8' );
    39     echo json_encode($results);    
    40     return ;
    View Code

      代码中的  $heads = array ( 'val:' . $value,'num:'.$url, );      val 和 num 即为 services.js 中的  var msg = req.headers.num; 和  var val = req.headers.val; 的请求数据。

      注:PHP 服务需要开启 php_curl.dll

        (1).打开php.ini,开启extension=php_curl.dll

          (2).检查php.ini的extension_dir值是哪个目录,检查有无php_curl.dll,没有的请下载php_curl.dll,再把php目录中的libeay32.dll,ssleay32.dll拷到c:windowssystem32里面.

        (3):关于curl_init :http://www.open-open.com/lib/view/open1408151927286.html

      5:数据请求(html)在文件夹 /AdminPHP/vew/ 下新建 html 文件 index.html:

        

    1 <form id="file" method="post" enctype="multipart/form-data">
    2     传输值:<input type="text" name="value" id="value" />
    3           <input type="button" value="上传" onclick="submits()"/>
    4 </form>

            构建这样一个界面: 

        javascript中的jquery的post传值:

     1 <script>
     2         var conf = {
     3             domain: 'http://127.0.0.1:3000/'
     4         };
     5         function submits() {
     6             var url = conf.domain + 'service/shows';
     7             var vals = $("#value").val();
     8             $.post('../admin/cenlent.php?url='+ encodeURIComponent(url), {values : vals}, function (data) {
     9                 if (data.status == 1) {
    10                     datas = eval("[" + data.data + "]");
    11                     var msg = '返回数据:' + datas[0].data + '  ;请求页面:' + datas[0].url;
    12                     alert(msg);
    13                 } else {
    14                     if (data.info !== undefined) {
    15                         alert(data.info);
    16                     } else {
    17                         alert('发生未知的异常,请重试~!');
    18                     }
    19                 }
    20             }, 'json');
    21 
    22             return false;
    23         }
    24 </script>
    View Code

           代码中: domain: 'http://127.0.0.1:3000/'   为请求的服务器地址(这是在本地测试,端口号在 app.js 配置中 app.set('port', process.env.PORT || 3000);)。

           var url = conf.domain + 'service/shows'; 中 'service/shows' -- services 对应于 app.js 配置文件的 app.post('/service/*', services.index);  即向 services.index 发起请求。

      而其中的  /shows 则是对方法的请求 ,在 services.js  文件中的  var params = req.params  即得到怕rams = shows 。

      6.测试:

        (1):在 cmd 终端进入 D: ode odejs-demo 文件夹下,输入  : node app.js   开启服务进程。(终端会打印出 Express server listening on port 3000);

        (2):在浏览器中输入 http://127.0.0.1/****/nodejs-demo/AdminPHP/view/   运行  index.html ,即必须在服务器运行 index.html 文件。 (注意:将  node 文件夹全部复制到 本地服务器 如:apache 的根目录下,不能使用 右击 index.html 用浏览器打开)。

              如图: 

         单击上传,即可到回复 :

              

                再次查看 终端:

              

      参考文件:  http://www.cnblogs.com/flyoung2008/archive/2012/07/22/2603791.html

             http://blog.uifanr.com/2013/03/12/472

             http://www.open-open.com/lib/view/open1408151927286.html

  • 相关阅读:
    线性代数学习笔记
    机器学习基石笔记
    how to design Programs 学习笔记
    programming-languages学习笔记--第2部分
    P6859 蝴蝶与花 思维 + 数据结构优化
    P6429 [COCI2010-2011#6] STEP 线段树维护最长01
    P1637 三元上升子序列 树状数组优化DP
    线段树模板3.0 区间乘
    CodeForces Global Round 11 B. Chess Cheater 贪心,处理技巧
    CodeForces Global Round 11 A. Avoiding Zero 构造
  • 原文地址:https://www.cnblogs.com/cj8988/p/4190025.html
Copyright © 2020-2023  润新知