详解用Node.js实现Restful风格webservice


Posted in Javascript onSeptember 29, 2017

Restful风格的WebService正在渐渐取代传统的SOAP, Java 也有很多Restful的框架,很方便简洁,Jersey,restlet,甚至SpringMVC也可以,不得不说Rest让人从Web转型到WebService更容易和方便,当然深入Restful的理论还是发现比较复杂的,但是,开发和理论并不需要那么的贴合,有时候伪Restful更直观,靠谱些。

但是,作为很帅的Node.js怎么可以不和同样帅气的Restful相结合呢!?对于我们这种无视理论的开发者来说,Restful不就是url的规范+HTTP method的规范而已嘛,所以Node这种很自由的技术来说,同样实现restful变的非常正常。不需要什么框架,但是我还是用了Express,Express只是对原生的http模块的一层封装而已,不要那么计较嘛!

Java曾经是一个Xml配置文件横行的世界,现在是各种Annotation(注解)乱入的世界,虽然注解的侵入性比较小,但是加了一摞注解的类也让人伤神,尤其是各框架混杂的注解,好在各大框架还是比较自觉的,各种负责不同的层,所以还不会导致各种注解的混乱。好了,那么下面欢迎来到,没有注解,也没用xml的世界:

----我是例子---------

var express = require('express') //加载模块 
var app = express() //实例化之 
 
var map = {"1":{id:1,name:"test"},"2":{id:2,name:"test"}} //定义一个集合资源,key为字符串完全是模仿java MAP<T,E>,否则谁会这么去写个hash啊! 
 
app.get('/devices',function(req, res){ //Restful Get方法,查找整个集合资源 
  res.set({'Content-Type':'text/json','Encodeing':'utf8'}); 
  res.send(map) 
}) 
app.get('/devices/:id',function(req, res){ //Restful Get方法,查找一个单一资源 
  res.set({'Content-Type':'text/json','Encodeing':'utf8'}); 
  res.send(map[req.param('id')]) 
  //console.log(req.param('id')) 
}) 
app.post('/devices/', express.bodyParser(), function(req, res){ //Restful Post方法,创建一个单一资源 
  res.set({'Content-Type':'text/json','Encodeing':'utf8'}); 
  map[req.body.id] = req.body 
  res.send({status:"success",url:"/devices/"+req.body.id}) //id 一般由数据库产生 
}) 
app.put('/devices/:id', express.bodyParser(), function(req, res){ //Restful Put方法,更新一个单一资源 
  res.set({'Content-Type':'text/json','Encodeing':'utf8'}); 
  map[req.body.id] = req.body 
  res.send({status:"success",url:"/devices/"+req.param('id'),device:req.body}); 
}) 
app.delete('/devices/:id',function(req, res){ //Restful Delete方法,删除一个单一资源 
  res.set({'Content-Type':'text/json','Encodeing':'utf8'}); 
  delete map[req.param('id')] 
  res.send({status:"success",url:"/devices/"+req.param('id')}) 
  console.log(map) 
}) 
app.listen(8888); //监听8888端口,没办法,总不好抢了tomcat的8080吧!

---------我是测试-----------

详解用Node.js实现Restful风格webservice

用Postman测试ok, 代码中唯一让人诧异的应该是delete map[req.param('id')],我们知道js的map是一个Object,或者Object是一个map,,delete object.property,可以删除这个属性,但是delete Object[Property]也可以把这个属性给干掉,delete o.x 也可以写作 delete o["x"],两者效果相同 关于delete请观看:ECMAScript delete!

系不系很方便哈!和那些XXX框架些的代码很类似啊!如果你是一个寻求不同的人,Node.js当然也满足你,一直备受争议的路由表上场了:

------我是另一个文件:routes.js--------

{ get:  
  [ { path: '/', 
    method: 'get', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/\/?$/i }, 
  { path: '/user/:id', 
    method: 'get', 
    callbacks: [Object], 
    keys: [{ name: 'id', optional: false }], 
    regexp: /^\/user\/(?:([^\/]+?))\/?$/i } ], 
delete:  
  [ { path: '/user/:id', 
    method: 'delete', 
    callbacks: [Object], 
    keys: [Object], 
    regexp: /^\/user\/(?:([^\/]+?))\/?$/i } ] }

定义这么一个对象,然后

var routes = require('./routes') 
app.use(app.router);//保留原来的 
routes(app);//这个是新加的,将前者作为默认路由

关于routes的更多内容:Express官网   靠谱些,毕竟node.js最大的问题,就是资料的api都太旧了!

Node.js处理请求包括其它一些Io都是异步的,很快,所以对于性能,我是比较看好的,关于Ab测试的结果,还在测,总之我希望可以秒杀tomcat!(不是集群哦!)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery学习笔记二 实现可编辑的表格
Apr 09 Javascript
javascript oop开发滑动(slide)菜单控件
Aug 25 Javascript
那些年,我还在学习jquery 学习笔记
Mar 05 Javascript
在JavaScript里嵌入大量字符串常量的实现方法
Jul 07 Javascript
JavaScript代码应该放在HTML代码哪个位置比较好?
Oct 16 Javascript
基于JavaScript如何实现ajax调用后台定义的方法
Dec 29 Javascript
js中通过getElementsByName访问name集合对象的方法
Oct 31 Javascript
Avalonjs 实现简单购物车功能(实例代码)
Feb 07 Javascript
详解微信小程序 相对定位和绝对定位
May 11 Javascript
基于layui数据表格以及传数据的方式
Aug 19 Javascript
javascript设计模式 ? 模板方法模式原理与用法实例分析
Apr 23 Javascript
Vue.js使用axios动态获取response里的data数据操作
Sep 08 Javascript
实现一个完整的Node.js RESTful API的示例
Sep 29 #Javascript
jquery鼠标悬停导航下划线滑出效果
Sep 29 #jQuery
vue axios同步请求解决方案
Sep 29 #Javascript
IntersectionObserver实现图片懒加载的示例
Sep 29 #Javascript
Grunt针对静态文件的压缩,版本控制打包的实例讲解
Sep 29 #Javascript
jQuery选择器之子元素过滤选择器
Sep 28 #jQuery
微信禁止下拉查看URL的处理方法
Sep 28 #Javascript
You might like
采用ThinkPHP中F方法实现快速缓存实例
2014/06/13 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(七)
2014/06/23 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
CI框架学习笔记(二) -入口文件index.php
2014/10/27 PHP
php获取json数据所有的节点路径
2015/05/17 PHP
laravel5创建service provider和facade的方法详解
2016/07/26 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
PHP后门隐藏的一些技巧总结
2020/11/04 PHP
Maps Javascript
2007/01/22 Javascript
获取offsetTop和offsetLeft值的js代码(兼容)
2013/04/16 Javascript
select、radio表单回显功能实现避免使用jquery载入赋值
2013/06/08 Javascript
js实现简单选项卡与自动切换效果的方法
2015/04/10 Javascript
原生js实现验证码功能
2017/03/16 Javascript
VUE利用vuex模拟实现新闻点赞功能实例
2017/06/28 Javascript
react实现一个优雅的图片占位模块组件详解
2017/10/30 Javascript
AngularJS实现的2048小游戏功能【附源码下载】
2018/01/03 Javascript
JS实现调用本地摄像头功能示例
2018/05/18 Javascript
微信小程序购物车、父子组件传值及calc的注意事项总结
2018/11/14 Javascript
浅谈js闭包理解
2019/03/28 Javascript
实用的Vue开发技巧
2019/05/30 Javascript
使用vue重构资讯页面的实例代码解析
2019/11/26 Javascript
让mocha支持ES6模块的方法实现
2020/01/14 Javascript
vue+element 实现商城主题开发的示例代码
2020/03/26 Javascript
解决vue做详情页跳转的时候使用created方法 数据不会更新问题
2020/07/24 Javascript
Python使用正则表达式过滤或替换HTML标签的方法详解
2017/09/25 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
2019/08/29 Python
python实现音乐播放和下载小程序功能
2020/04/26 Python
python3 中时间戳、时间、日期的转换和加减操作
2020/07/14 Python
波比布朗英国官网:Bobbi Brown英国
2017/11/13 全球购物
企业精神口号
2014/06/11 职场文书
装修活动策划方案
2014/08/27 职场文书
大雁塔导游词
2015/02/04 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
校园之声广播稿
2015/08/18 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
css3属性选择器 “~”(波浪号) “,”(逗号) “+”(加号)和 “>”(大于号)
2022/04/19 HTML / CSS