一、HTTP服务器的基本知识

  1、Node如何向开发者呈现HTTP请求

  Node中的http模块提供了HTTP服务器和客户端接口:

var http = require('http');

  创建HTTP服务器要调用http.createServer()函数。它只有一个函数,是个回调函数,服务器每次收到HTTP请求后都会调用这个回调函数。这个请求回调会收到两个参数,请求和响应对象,通常简写为req和res。

var http = require('http');
var server = http.createServer(function(req,res){
//处理请求
});

  2、一个用“hello world”做响应的HTTP服务器

var http = require('http');
var server = http.createServer(function(req,res){
res.end('hello world');
});
server.listen(3000);

  3、读取请求头及设定响应头

  Node提供了几个修改HTTP响应有的方法:res.setHeadrt(field.value),res.getHeader(field)和res.removeHeader(field).

  添加和移除响应头的顺序可以随意,但一定要再调用res.write()或res.edn()之前。在响应主体的第一部分写入之后,Node会刷新已经设定好的HTTP头

  4、设定HTTP响应的状态吗

  我们经常要返回默认状态200之外的HTTP状态码。

二、构建RESTful Web服务

  本节创建一个RESTful Web服务,一个使用HTTP方法谓词提供精简API的服务。

  创建标准的REST服务器需要实现四个HTTP谓词,每个谓词为覆盖一个待办事项清单的操作任务:

  POST 向待办事项清单中添加事项

  GET 显示当前事项列表,或则显示某一事项的详情。

  DELETE 从待办事项清单中移除事项

  PUT 修改已有事项。

  1、用POST请求创建资源。

  按照RESTful的说法,资源的创建通常是跟谓词POST对应的,因此POST将在待办事项清单中创建一个事项。

  在Node中,可以通过检查req.method属性查看用的是哪个HTTP方法(谓词)。知道请求用的是哪个方法,服务器就能知道要执行哪个任务。

  当Node的HTTP解析器读入并解析请求数据时,他会将数据做成data时间的形式,吧解析好的数据块放入其中,等待程序处理。

  我们新建一个todo.js文件

/**
* POST请求字符串缓存
*/
var http = require('http');
var url = require('url');
var items = []; //用一个常规的Javascript数组存放数据 var server = http.createServer(function(req,res){
switch (req.method){ //req.method是请求所有的HTTP方法
case 'POST':
var item = ''; //为进来的事情设置字符缓存
req.setEncoding('utf8'); //将进来的data事件编码为UTP-8字符串
req.on('data',function(chunk){
item += chunk ; //将数据凭借到缓存上
});
req.on('end',function(){
items.push(item); //将完整的新事项压入事项数组中
res.end('ok\n');
});
break;
}
});

  2、用GET请求获取资源

  为了处理GET,我么把他添加到switch语种,再加上待办事项的逻辑

var http = require('http');
var url = require('url');
var items = []; //用一个常规的Javascript数组存放数据 var server = http.createServer(function(req,res){
switch (req.method){ //req.method是请求所有的HTTP方法
case 'POST':
var item = ''; //为进来的事情设置字符缓存
req.setEncoding('utf8'); //将进来的data事件编码为UTP-8字符串
req.on('data',function(chunk){
item += chunk ; //将数据凭借到缓存上
});
req.on('end',function(){
items.push(item); //将完整的新事项压入事项数组中
res.end('ok\n');
});
break;
case 'GET':
items.forEach(function(item,i){
res.write(i+')'+itme+'\n');
});
res.end();
break;
}
});

  NODE和其他语言一样,提供了一个REPL(读取-计算-输出-循环)环境,在命令行中不带任何参数运行node就可以进入这个环境。

  3、用DELETE请求移除资源

......
case 'DELETE':
var path = url.parse(req.url).pathname;
var i = parseInt(path.slice(1),10);
if(isNaN){ //检查数字是否有效
res.statusCode = 400;
res.end('Invalid item id');
}else if(!item[i]){ //确保请求的索引存在
res.statusCode = 404;
res.end('Item not found');
}else{
itmes.splice(i,1); //删除请求事项
res.end('OK\n');
}
break;

NODE编程(三)--构建Node Web程序1的更多相关文章

  1. 使用Node.js的socket.io模块开发实时web程序

    首发:个人博客,更新&纠错&回复 今天的思维漫游如下:从.net的windows程序开发,摸到nodejs的桌面程序开发,又熟悉了一下nodejs,对“异步”的理解有了上上周对操作系统 ...

  2. Nodejs学习笔记(七)--- Node.js + Express 构建网站简单示例

    目录 前言 新建项目.建立数据库以及其它准备工作 新建express + ejs 项目:sampleEjs 创建数据库 修改package.json文件,安装session和mysql模块 样式和JQ ...

  3. 实战案例--Grunt构建Web程序

    GruntJS构建Web程序.使用Gruntjs来搭建一个前端项目,然后使用grunt合并,压缩JS文件,熟练了node.js安装和grunt.js安装后,接下来来实战一个案例,案例是根据snandy ...

  4. node.js之十大Web框架

    之前接触过Node.js是因为好奇大前端越来越能干了,连我后台的饭碗都要抢了,太嚣张了,于是我想打压打压它,然后就这样接触它了.再到后来是因为Settings-Sync插件二次开发,我需要用node. ...

  5. Nodejs学习笔记(七)—Node.js + Express 构建网站简单示例

    前言 上一篇学习了一些构建网站会用到的一些知识点:https://www.cnblogs.com/flyingeagle/p/9192936.html 这一篇主要结合前面讲到的知识,去构建一个较为完整 ...

  6. 基于 Egg.js 框架的 Node.js 服务构建之用户管理设计

    前言 近来公司需要构建一套 EMM(Enterprise Mobility Management)的管理平台,就这种面向企业的应用管理本身需要考虑的需求是十分复杂的,技术层面管理端和服务端构建是架构核 ...

  7. 使用V8和node轻松profile分析nodejs应用程序

    目录 简介 使用V8的内置profiler工具 使用gm来build V8 手动build V8 生成profile文件 分析生成的文件 生成时间线图 使用nodejs的profile工具 简介 我们 ...

  8. Node.js学习笔记——Node.js开发Web后台服务

    一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...

  9. Fenix – 基于 Node.js 的桌面静态 Web 服务器

    Fenix 是一个提供给开发人员使用的简单的桌面静态 Web 服务器,基于 Node.js 开发.您可以同时在上面运行任意数量的项目,特别适合前端开发人员使用. 您可以通过免费的 Node.js 控制 ...

随机推荐

  1. jQuery/CSS3大屏下拉菜单 自定义子菜单内容

    这是一款样式很酷的jQuery/CSS3下拉菜单,首先这款CSS3菜单是宽屏的,主要是下拉菜单非常大气,更重要的是,下拉菜单的内容可以自己定义,也就是说,下拉菜单中可以定义菜单.图片等HTML元素,是 ...

  2. JAVA基础----java中E,T,?的区别

    遇到<A>,<B>,<K,V>等,是用到了java中的泛型. 一般使用<T>来声明类型持有者名称,自定义泛型类时,类持有者名称可以使用T(Type) 如 ...

  3. http响应Last-Modified和ETag(转)

    基础知识 1) 什么是”Last-Modified”? 在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期 ...

  4. Emacs Lisp 功能扩展集锦

    http://docs.huihoo.com/homepage/shredderyin/emacs_elisp.html Emacs 具有超强的扩展性.这是当今没有任何其它编辑器可以比拟 的强大特点. ...

  5. IOS下arm64汇编疑问

    之前所有关于32位下的纯汇编.s代码,在编译arm64的时候,很多错误,不得已只能用C代码. 但是arm_neon.h内部类C接口的汇编,基本上没有问题.不敢完全保证,还有待确认.关于arm64位的汇 ...

  6. 启动程序的同时传参给接收程序(XE8+WIN764)

    相关资料: http://blog.csdn.net/yanjiaye520/article/details/7590252 注意事项: 1.ParamStr(0)是实例自己. 2.传的参数是以空格分 ...

  7. 转载LINQ系列OrderBy(), ThenBy()简介

    前言 前面两篇分别介绍了 Where() 与 Select() ,这篇则是要介绍 OrderBy() 与 ThenBy() ,这几个东西看起来最像 SQL 上会用到的语法,但切记一点,这边介绍的是 L ...

  8. C#全角半角转换函数

    Code#region 全角半角转换 /// <summary> /// 转全角的函数(SBC case) /// </summary> /// <param name= ...

  9. linux查看cpu、内存信息

    #查看CPU信息(型号) cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c   # 总核数 = 物理CPU个数 X 每颗物理CPU的核数  # ...

  10. Squid 日志详解

    原文地址: http://www.php-oa.com/2008/01/17/squid-log-access-store.html access.log 日志 在squid中access访问日志最为 ...