node.js+Ajax实现获取HTTP服务器返回数据


Posted in Javascript onNovember 26, 2014

我们看一个HTML5页面中通过AJAX请求的方式获取HTTP服务器返回数据的代码示例.由于我们把服务器的端口指定为1337,并将从端口为80的网站中运行HTML5页面,因此这是一种跨域操作,需要在HTTP响应头部中添加Access_Control_Allow_Origin字段,并且将参数指定为允许向服务器请求数据额域名+端口号(省略端口号时允许该域名下的任何端口向服务器请求数据),

静态页面:index.html(注:一定要放在服务器环境下,如果是win7系统的话,可以开启IIS服务,并把页面考过去直接运行这个页面,)

<!DOCTYPE html>

<html>

<head lang="en">

    <meta charset="UTF-8">

    <title>node中的ajax请求(html5页面)</title>

    <script type="text/javascript">

        function GetData(){

            var xhr=new XMLHttpRequest();

            xhr.open("GET","http://localhost:1337/",true);

            xhr.onreadystatechange=function(){

                if(xhr.readyState==4){

                    if(xhr.status==200){

                        document.getElementById("res").innerHTML=xhr.responseText;

                    }

                }

            }

            xhr.send(null);

        }

    </script>

</head>

<body>

<input type="button" value="获取数据" onclick="GetData()" />

<div id="res">dsdf</div>

</body>

</html>

node代码:

var http=require("http");

var server=http.createServer(function(req,res){

    if(req.url!=="/favicon.ico"){

        res.writeHead(200,{"Content-Type":"text/plain","Access-Control-Allow-Origin":"http://localhost"});

        res.write("你好啊!");

    }

    res.end();

});

server.listen(1337,"localhost",function(){

    console.log("开始监听...");

});

首先开启服务:node server.js

启动静态页面:

node.js+Ajax实现获取HTTP服务器返回数据

点击按钮"获取数据"

node.js+Ajax实现获取HTTP服务器返回数据

如果大家觉得需要配置服务器环境太麻烦,可以借用编辑器的优势来做.

比如我用的是webstrom 8.0;

当我启动页面的时候,浏览器中显示的是这个路径:

node.js+Ajax实现获取HTTP服务器返回数据

端口是63342.这个时候我们队代码做一些修改:

node的 server.js代码:

var http=require("http");

var server=http.createServer(function(req,res){

    if(req.url!=="/favicon.ico"){

        res.writeHead(200,{"Content-Type":"text/plain","Access-Control-Allow-Origin":"http://localhost:63342"});

        //res.setHeader();

        res.write("你好啊!");

    }

    res.end();

});

server.listen(1337,"localhost",function(){

    console.log("开始监听...");

});

修改了"Access-Control-Allow-Origin"的值.

重新运行demo会发现,达到同样的效果

也可以通过res.seetHeader来单独设置响应头部.

可以将上面的res.writeHead()改成res.setHeader();

var http=require("http");

var server=http.createServer(function(req,res){

    if(req.url!=="/favicon.ico"){

        //res.writeHead(200,{"Content-Type":"text/plain","Access-Control-Allow-Origin":"http://localhost:63342"});

        res.setHeader("Content-Type","text/plain");

        res.setHeader("Access-Control-Allow-Origin","http://localhost:63342");

        res.write("你好啊!");

    }

    res.end();

});

server.listen(1337,"localhost",function(){

    console.log("开始监听...");

});

细心的同学可能发现了,利用setHeader的方法时,缺少了一个状态码,比如200.那么我们在使用res.setHeader的时候,如何来设置状态码呢?等会上代码

ajax在服务器端返回的时候日期:

node.js+Ajax实现获取HTTP服务器返回数据

我们可以在服务器端返回时,删除这个字段.

设置res.sendData=false;

var http=require("http");

var server=http.createServer(function(req,res){

    if(req.url!=="/favicon.ico"){

        //res.writeHead(200,{"Content-Type":"text/plain","Access-Control-Allow-Origin":"http://localhost:63342"});

        res.statusCode=200;

        res.sendDate=false;

        res.setHeader("Content-Type","text/plain");

        res.setHeader("Access-Control-Allow-Origin","http://localhost:63342");

        res.write("你好啊!");

    }

    res.end();

});

server.listen(1337,"localhost",function(){

    console.log("开始监听...");

});

node.js+Ajax实现获取HTTP服务器返回数据

设置了状态码,也屏蔽了日期信息.

res.getHeader(name)获取我们设置的响应头信息

res.removeHeader(name);删除我们的头信息.必须在我们的write方法发送数据之情被调用.

res.headersSent属性是一个布尔值,当当响应头已发送时,属性值为true时;当响应头未发送时,属性值为false.

server.js代码:

var http=require("http");

var server=http.createServer(function(req,res){

    if(req.url!=="/favicon.ico"){

        if(res.headersSent)

            console.log("响应头已发送");

        else

            console.log("响应头未发送");

        res.writeHead(200,{"Content-Type":"text/plain","Access-Control-Allow-Origin":"http://localhost:63342"});

        if(res.headersSent)

            console.log("响应头已发送");

        else

            console.log("响应头未发送");        

        res.write("你好啊!");

    }

    res.end();

});

server.listen(1337,"localhost",function(){

    console.log("开始监听...");

});

运行demo查看结果:

node.js+Ajax实现获取HTTP服务器返回数据

res.write()方法是向客户端发送数据的,其实他还有一个返回值.

当向客户端发送的数据量比较小时或网速较快时,node总是将数据直接发送到操作系统的内核缓存区中,然后从内核缓存区中取出数据发送给对方.这个时候write会返回true.

当网速慢或数据量较大时,http服务器并不一定会立刻把数据发送给客户端,node会把数据缓存在内存中,并在对方可以接受数据的情况下将内存中的数据通过操作系统的内核发送给对方.这时的write返回false.

node.js+Ajax实现获取HTTP服务器返回数据

可以设置test.txt的内容多少来测试结果.

一个简单的node+ajax效果就实现了.是不是很简单呢?当然,想制作更加复杂的功能的话,我们还需要进一步的学习,以后我们慢慢来更新。

Javascript 相关文章推荐
如何实现iframe(嵌入式帧)的自适应高度
Jul 26 Javascript
javascript 限制输入脚本大全
Nov 03 Javascript
基于JQuery的cookie插件
Apr 07 Javascript
JS实现的简洁纵向滑动菜单(滑动门)效果
Oct 19 Javascript
jQuery ajax时间差导致的变量赋值问题分析
Jan 22 Javascript
jQuery中slidedown与slideup方法用法示例
Sep 16 Javascript
vue2实现数据请求显示loading图
Nov 28 Javascript
AngularJs 禁止模板缓存的方法
Nov 28 Javascript
js中document.write和document.writeln的区别
Mar 11 Javascript
vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法
Aug 22 Javascript
详解nuxt路由鉴权(express模板)
Nov 21 Javascript
浏览器JavaScript调试功能无法使用解决方案
Sep 18 Javascript
使用node.js 获取客户端信息代码分享
Nov 26 #Javascript
node+express+jade制作简单网站指南
Nov 26 #Javascript
JS简单操作select和dropdownlist实例
Nov 26 #Javascript
node+express+ejs制作简单页面上手指南
Nov 26 #Javascript
node.js使用require()函数加载模块
Nov 26 #Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
Nov 26 #Javascript
浅谈jQuery中对象遍历.eq().first().last().slice()方法
Nov 26 #Javascript
You might like
php Http_Template_IT类库进行模板替换
2009/03/19 PHP
PHP的几个常用数字判断函数代码
2012/04/24 PHP
Zend Framework+smarty用法实例详解
2016/03/19 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
php实现大文件断点续传下载实例代码
2019/10/01 PHP
javascript 面向对象思想 附源码
2009/07/07 Javascript
js css后面所带参数含义介绍
2013/08/18 Javascript
Jquery仿淘宝京东多条件筛选可自行结合ajax加载示例
2013/08/28 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
2014/03/13 Javascript
jQuery的animate函数学习记录
2014/08/08 Javascript
JavaScript操作DOM元素的childNodes和children区别
2015/04/01 Javascript
javascript原型模式用法实例详解
2015/06/04 Javascript
基于JS实现回到页面顶部的五种写法(从实现到增强)
2016/09/03 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
vue系列之动态路由详解【原创】
2017/09/10 Javascript
浅谈vue+webpack项目调试方法步骤
2017/09/11 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
2019/03/21 Javascript
vue中datepicker的使用教程实例代码详解
2019/07/08 Javascript
layui2.0使用table+laypage实现真分页
2019/07/27 Javascript
js实现内置计时器
2019/12/16 Javascript
解决vue+ element ui 表单验证有值但验证失败问题
2020/01/16 Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
2020/04/11 Javascript
[03:56]DOTA2完美大师赛趣味视频之小鸽子和Mineski打台球
2017/11/24 DOTA
Python实现求解括号匹配问题的方法
2018/04/17 Python
解决每次打开pycharm直接进入项目的问题
2018/10/28 Python
Python Django基础二之URL路由系统
2019/07/18 Python
python 读取修改pcap包的例子
2019/07/23 Python
python 解决tqdm模块不能单行显示的问题
2020/02/19 Python
python批量替换文件名中的共同字符实例
2020/03/05 Python
Pycharm 设置默认解释器路径和编码格式的操作
2021/02/05 Python
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
机关作风整顿个人剖析材料
2014/10/06 职场文书
慈善募捐倡议书
2015/04/27 职场文书
详解nginx进程锁的实现
2021/06/14 Servers
java调用Restful接口的三种方法
2021/08/23 Java/Android