详解用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 相关文章推荐
js取消单选按钮选中示例代码
Nov 14 Javascript
jquery 表格排序、实时搜索表格内容(附图)
May 19 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
Oct 17 Javascript
实现无刷新联动例子汇总
May 20 Javascript
jQuery操作动态生成的内容的方法
May 28 Javascript
微信小程序开发一键登录 获取session_key和openid实例
Nov 23 Javascript
基于canvas的二维码邀请函生成插件
Feb 14 Javascript
ES6新特性之函数的扩展实例详解
Apr 01 Javascript
jQuery实现倒计时功能 jQuery实现计时器功能
Sep 19 jQuery
解决Vue 项目打包后favicon无法正常显示的问题
Sep 01 Javascript
详解vuejs2.0 select 动态绑定下拉框支持多选
Apr 25 Javascript
Vue CLI中模式与环境变量的深入详解
May 30 Vue.js
实现一个完整的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
为什么那些咖啡爱好者大多看不上连锁咖啡店?
2021/03/06 咖啡文化
CodeIgniter安全相关设置汇总
2014/07/03 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
2019/10/08 PHP
javascript 打开页面window.location和window.open的区别
2010/03/17 Javascript
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
将光标定位于输入框最右侧实现代码
2012/12/04 Javascript
JavaScript及jquey实现多个数组的合并操作
2014/09/06 Javascript
JS控制表单提交的方法
2015/07/09 Javascript
IE10中flexigrid无法显示数据的解决方法
2015/07/26 Javascript
js实现浏览本地文件并显示扩展名的方法
2015/08/17 Javascript
JS 日期与时间戮相互转化的简单实例
2016/06/22 Javascript
原生js实现class的添加和删除简单代码
2016/07/12 Javascript
快速将Vue项目升级到webpack3的方法步骤
2017/09/14 Javascript
简单实现vue验证码60秒倒计时功能
2017/10/11 Javascript
如何重置vue打印变量的显示方式
2017/12/06 Javascript
vue+axios新手实践实现登陆的示例代码
2018/06/06 Javascript
微信小程序实现跑马灯效果
2020/10/21 Javascript
Vuex中实现数据状态查询与更改
2019/11/08 Javascript
Python 的描述符 descriptor详解
2016/02/27 Python
python+tkinter编写电脑桌面放大镜程序实例代码
2018/01/16 Python
PyQt5每天必学之QSplitter实现窗口分隔
2018/04/19 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
2018/04/23 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
2018/07/12 Python
Python批量删除只保留最近几天table的代码实例
2019/04/01 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
python 追踪except信息方式
2020/04/25 Python
HTML5网页音乐播放器的示例代码
2017/11/09 HTML / CSS
全球最大的网上自行车商店:Chain Reaction Cycles
2016/12/02 全球购物
英国顶级家庭折扣店:The Works
2017/09/06 全球购物
婴儿鞋,独特的婴儿服装和配件:Zutano
2018/11/03 全球购物
AutoShack.com加拿大:北美主要的汽车零部件零售商
2019/07/24 全球购物
电子商务专业在校生实习自我鉴定
2013/09/29 职场文书
中式婚礼主持词
2014/03/13 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
入党转正申请报告
2015/05/15 职场文书
2015年社区工会工作总结
2015/05/26 职场文书