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 相关文章推荐
Extjs4 消息框去掉关闭按钮(类似Ext.Msg.alert)
Apr 02 Javascript
js中单引号与双引号冲突问题解决方法
Oct 04 Javascript
jquery实现ajax加载超时提示的方法
Jul 23 Javascript
基于JavaScript实现自动更新倒计时效果
Dec 19 Javascript
js实现密码强度检验
Jan 15 Javascript
原生JS轮播图插件
Feb 09 Javascript
Vue.js 2.0学习教程之从基础到组件详解
Apr 24 Javascript
浅谈Vue父子组件和非父子组件传值问题
Aug 22 Javascript
JavaScript基于对象方法实现数组去重及排序操作示例
Jul 10 Javascript
vue将毫秒数转化为正常日期格式的实例
Sep 16 Javascript
如何用webpack4.0撸单页/多页脚手架 (jquery, react, vue, typescript)
Jun 18 jQuery
Javascript异步流程控制之串行执行详解
Sep 27 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
mysql5的sql文件导入到mysql4的方法
2008/10/19 PHP
PHP抽象类基本用法示例
2018/12/28 PHP
javascript中onclick(this)用法介绍
2013/04/19 Javascript
jQuery中not()方法用法实例
2015/01/06 Javascript
JavaScript数据类型检测代码分享
2015/01/26 Javascript
jquery插件corner实现圆角边框的方法
2015/03/09 Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
2016/05/21 Javascript
BootStrap3使用错误记录及解决办法
2016/12/22 Javascript
javaScript基础详解
2017/01/19 Javascript
js 递归和定时器的实例解析
2017/02/03 Javascript
Vue中保存用户登录状态实例代码
2017/06/07 Javascript
将 vue 生成的 js 上传到七牛的实例
2017/07/28 Javascript
bootstrap3中container与container_fluid外层容器的区别讲解
2017/12/04 Javascript
js+css实现打字效果
2020/06/24 Javascript
vue项目中api接口管理总结
2018/04/20 Javascript
JQuery特殊效果和链式调用操作示例
2019/05/13 jQuery
JavaScript中this的全面解析及常见实例
2019/05/14 Javascript
jQuery内容选择器与表单选择器实例分析
2019/06/28 jQuery
纯JS开发baguetteBox.js响应式画廊插件
2020/06/28 Javascript
jQuery加PHP实现图片上传并提交的示例代码
2020/07/16 jQuery
[01:17:47]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
Python使用minidom读写xml的方法
2015/06/03 Python
python数据类型_元组、字典常用操作方法(介绍)
2017/05/30 Python
python使用jieba实现中文分词去停用词方法示例
2018/03/11 Python
python实现字符串完美拆分split()的方法
2019/07/16 Python
python 如何调用 dubbo 接口
2020/09/24 Python
python中xlutils库用法浅析
2020/12/29 Python
详解CSS3 弹性布局快速入门
2019/06/06 HTML / CSS
美国一家全面的在线零售鞋类公司:SHOEBACCA
2017/01/06 全球购物
幼儿教师辞职信
2015/02/27 职场文书
导游词之永泰公主墓
2019/12/04 职场文书
HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手
2021/05/10 HTML / CSS
HTML基础详解(上)
2021/10/16 HTML / CSS
Golang流模式之grpc的四种数据流
2022/04/13 Golang
vue-cli3.x配置全局的scss的时候报错问题及解决
2022/04/30 Vue.js