详解用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 相关文章推荐
javascript 面向对象的JavaScript类
May 04 Javascript
JavaScript接口实现代码 (Interfaces In JavaScript)
Jun 11 Javascript
多浏览器兼容性比较好的复制到剪贴板的js代码
Oct 09 Javascript
jQuery实现强制cookie过期方法汇总
May 22 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
Nov 19 Javascript
Bootstrap的Refresh Icon也spin起来
Jul 13 Javascript
vue+vuex+axios+echarts画一个动态更新的中国地图的方法
Dec 19 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
May 15 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
Dec 05 Javascript
JS使用canvas中的measureText方法测量字体宽度示例
Feb 02 Javascript
24个ES6方法解决JS实际开发问题(小结)
May 31 Javascript
vue3.0生命周期的示例代码
Sep 24 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
PHP查询MySQL大量数据的时候内存占用分析
2011/07/22 PHP
无JS,完全php面向过程数据分页实现代码
2012/08/27 PHP
百度地图API应用之获取用户的具体位置
2014/06/10 PHP
使用PHP json_decode可能遇到的坑与解决方法
2017/08/03 PHP
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
Jquery模仿Baidu、Google搜索时自动补充搜索结果提示
2013/12/26 Javascript
JavaScript表单通过正则表达式验证电话号码
2014/03/14 Javascript
jquery获取颜色在ie和ff下的区别示例介绍
2014/03/28 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
深入理解JavaScript的React框架的原理
2015/07/02 Javascript
JavaScript实现模仿桌面窗口的方法
2015/07/18 Javascript
基于JavaScript创建动态Dom
2015/12/08 Javascript
JS实现根据密码长度显示安全条功能
2017/03/08 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
axios取消请求的实践记录分享
2018/09/26 Javascript
JS实现省市县三级下拉联动
2020/04/10 Javascript
vue 使用vant插件做tabs切换和无限加载功能的实现
2020/11/04 Javascript
Vue-router编程式导航的两种实现代码
2021/03/04 Vue.js
[40:12]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python中处理字符串之endswith()方法的使用简介
2015/05/18 Python
Django框架中的对象列表视图使用示例
2015/07/21 Python
django DRF图片路径问题的解决方法
2018/09/10 Python
python实现图片中文字分割效果
2019/07/22 Python
详解在Python中使用Torchmoji将文本转换为表情符号
2020/07/27 Python
python中not、and和or的优先级与详细用法介绍
2020/11/03 Python
俄罗斯香水和化妆品在线商店:Aroma-butik
2020/02/28 全球购物
资产评估专业学生的自我鉴定
2013/11/14 职场文书
书法培训心得体会
2014/01/05 职场文书
大型会议策划方案
2014/05/17 职场文书
技能比武方案
2014/05/21 职场文书
工程项目经理任命书
2014/06/05 职场文书
安全标兵事迹材料
2014/08/17 职场文书
2014年医生工作总结
2014/11/21 职场文书
公司经营目标责任书
2015/01/29 职场文书
2016年“我们的节日·重阳节”主题活动总结
2016/04/01 职场文书