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 :
var http = require("http");
http.createServer(function(request, response) {
response.writeHead(200, {"Content-Type": 'application/json;charset=UTF-8'});
response.write("hello");
response.end();
}).listen(8899);
console.log("nodejs start listen 8899 port!");
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:\node\nodejs-demo\ 文件夹下 npm install express ,将会在该文件夹下建立node_modules,并在
其中引入 express模板,再引入一个模板 :npm install ejs ,将会在node_modules文件夹下引入 ejs 模板。框架大体就搭建好了。
2:routes 文件夹下新建一个 js 文件,services.js :
exports.index = function (req, res) {
var params = req.params;//得到3000:后的 shows。
switch (params[0]) {
case 'shows':
shows(req, res);
break;
case 'select':
// selects(req, res);
break;
}
};
var shows = function (req, res) {
var msg = req.headers.num;//得到
var val = req.headers.val
res.setHeader('Content-Type', 'application/json;charset=UTF-8');
res.send({
'status': 1,
'data': " hellow.date: " + val,
'url': " hellow.URL: " + msg,
});
res.end();
};
其中 req 为请求数据,req.params 得到请求的第一个参数(app.js有配置),req.headers.num 得到客户端 请求的num 参数。
3:配置 app.js :
var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var services = require('./routes/services');
var http = require('http');
var path = require('path');
var app = express();
// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
// development only
if ('development' == app.get('env')) {
app.use(express.errorHandler());
}
app.get('/', routes.index);
app.get('/users', user.list);
app.get('/service/*', services.index);
app.post('/service/*', services.index);
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
通过引入添加的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 文件,作为请求代理:
<?php
$value = $_POST["values"];
$url = $_GET["url"];
$heads = array (
'val:' . $value,
'num:'.$url,
);
//$fields = array(
// 'vals:'.'中心'
//);
$ch = curl_init ();
// 设置选项,包括URL
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_HEADER, 0 );
curl_setopt ( $ch, CURLOPT_HTTPHEADER, $heads);
curl_setopt ( $ch, CURLOPT_TIMEOUT, 5 ); // 定义超时5秒钟
//curl_setopt ( $ch, CURLOPT_POST, 1 ); // POST数据
//curl_setopt ( $ch, CURLOPT_POSTFIELDS, $fields ); // 把post的变量加上
$result = curl_exec ( $ch );
curl_close ( $ch );
if($result != null){
$results=array(
'status'=>1,
'data' => $result
);
}else{
$results=array(
'status'=> -1,
'info' => '服务器错误'
);
}
header ( 'Content-Type:application/json; charset=utf-8' );
echo json_encode($results);
return ;
代码中的 $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:\windows\system32里面.
(3):关于curl_init :http://www.open-open.com/lib/view/open1408151927286.html
5:数据请求(html)在文件夹 /AdminPHP/vew/ 下新建 html 文件 index.html:
<form id="file" method="post" enctype="multipart/form-data">
传输值:<input type="text" name="value" id="value" />
<input type="button" value="上传" onclick="submits()"/>
</form>
构建这样一个界面:
。
javascript中的jquery的post传值:
<script>
var conf = {
domain: 'http://127.0.0.1:3000/'
};
function submits() {
var url = conf.domain + 'service/shows';
var vals = $("#value").val();
$.post('../admin/cenlent.php?url='+ encodeURIComponent(url), {values : vals}, function (data) {
if (data.status == 1) {
datas = eval("[" + data.data + "]");
var msg = '返回数据:' + datas[0].data + ' ;请求页面:' + datas[0].url;
alert(msg);
} else {
if (data.info !== undefined) {
alert(data.info);
} else {
alert('发生未知的异常,请重试~!');
}
}
}, 'json'); return false;
}
</script>
代码中: domain: 'http://127.0.0.1:/' 为请求的服务器地址(这是在本地测试,端口号在 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:\node\nodejs-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
PHP跨域请求nodejs的更多相关文章
- Nodejs解决所有跨域请求
Nodejs解决所有跨域请求 app.use(function(req, res, next) { res.setHeader('Access-Control-Allow-Origin', '*'); ...
- nodeJS中express框架设置全局跨域请求头
//设置跨域请求头 router.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin&qu ...
- MediaElement.js之浏览器跨域请求视频播放
浏览器跨域问题一直以来都是作为前端开发人员常见的问题,所以今天学习了下如何使浏览器跨域请求资源 需要了解的知识 -域(主域,子域,什么是跨域) 简单来说由于浏览器同源策略,凡是发送请求url的协议(h ...
- Nginx反向代理、CORS、JSONP等跨域请求解决方法总结
由于 Javascript 同源策略的存在使得一个源中加载来自其它源中资源的行为受到了限制.即会出现跨域请求禁止. 通俗一点说就是如果存在协议.域名.端口或者子域名不同服务端,或一者为IP地址,一者为 ...
- 浏览器跨域请求之credentials
-时间起源- 前段时间,需要弄个简单的网站出来,访问远程的api服务. 我是这么做的.首先是在搭建一个nodejs服务来运行前端页面.在我请求登录的时候,能成功返回相应的成功信息.然后,当我再次请求读 ...
- js跨域请求解决方案
什么是跨域? 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的. 广义的跨域: 1.) 资源跳转: A链接.重定向.表单提交 2.) 资源嵌入: <link>.&l ...
- Laravel中的ajax跨域请求
最近接触Laravel框架ajax跨域请求的过程中遇到一些问题,在这里做下总结. 一开始发起ajax请求一直报500错误,搜索相关资料后发现Laravel要允许跨域请求可以加入Cors中间件,代码如下 ...
- 跨域请求——WebClient通过get和post请求api
AJAX不可以实现跨域请求,经过特殊处理才行.一般后台可以通过WebClient实现跨域请求~ //get 请求 string url = string.Format("htt ...
- 原生js封装ajax,实现跨域请求
描述: 需要ajax跨域请求,用cors跨域方案.服务端设置: header('Access-Control-Allow-Origin: http://front.ls-la.me'); header ...
随机推荐
- Carryon的字符串
I J I: Carryon的字符串 时间限制: 1 s 内存限制: 128 MB 提交 我的状态 题目描述 Carryon最近喜欢上了一些奇奇怪怪的字符,字符都是英文小写字母,但 ...
- POJ 1061青蛙的约会。求解(x+mT)%L=(y+nT)%L的最小步数T。
因为是同余,所以就是(x+mT)%L-(y+nT)%L=0.可以写成(x-y+(m-n)T)%L=0.就是这个数是L的倍数啦.那么我可以这样x-y+(m-n)T + Ls = 0.就可以了,s可正可负 ...
- hide(),show()
var newstypevalue =$("#newstype option:selected").val(); if(newstypevalue=='0'){ ...
- 经典PHP笔试题
1.考虑如下脚本.标记处应该添加什么代码才能让脚本输出字符串php? $alpha = 'abcdefghijklmnopqrstuvwxyz'; $letters = array(15, 7, 15 ...
- webpack 3 优化
编译时间太长 项目为多页面应用时,编译的时候每个入口都会读取依赖的路径,所以入口越多,会导致编译越慢 公用库提取 除了公用的框架(如 Vue.React)以外,不同页面所需要的第三方库可能不一样,而且 ...
- Vue小贴士
1.去掉空格影响,删除掉此段代码 2.想要同时运行两个Vue项目,修改端口号,黄色框内的内容自己随意改个端口号就行,比如:8082 3.批处理 在项目的根目录中添加a.bat文件,这样就可以在运行的 ...
- mysql 批量修改 表字段/表/数据库 字符集和排序规则
今天接到一个任务是需要把数据库的字符编码全部修改一下,写了以下修正用的SQL,修正顺序是 表字段 > 表 > 数据库. 表字段修复: #改变字段数据 SELECT TABLE_SCHE ...
- MyBatis源码探索
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的.SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获 ...
- centOS7虚拟机连接大网
1.启动vm服务 如果遇到无法启动时,需要还原vm默认配置解决 2.更改vm设置为NAT模式 3.centOS开启DHCP
- 六、C++离散傅里叶逆变换
C++离散傅里叶逆变换 一.序言: 该教程承接上文的离散傅里叶变换,用于进行离散傅里叶逆变换. 二.设计目标 对复数数组进行离散傅里叶逆变换,并生成可供使用的图像类. 三.详细步骤 输入:经傅里叶变换 ...