详解用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 相关文章推荐
Extjs学习过程中新手容易碰到的低级错误积累
Feb 11 Javascript
基于jquery的checkbox下拉框插件代码
Jun 25 Javascript
javascript表单验证和Window详解
Dec 11 Javascript
js动态修改表格行colspan列跨度的方法
Mar 30 Javascript
AngularJS实现全选反选功能
Dec 08 Javascript
Bootstrap轮播插件简单使用方法介绍
Jun 21 Javascript
JS获取和修改元素样式的实例代码
Aug 06 Javascript
Javascript仿京东放大镜的效果
Mar 01 Javascript
jquery tmpl模板(实例讲解)
Sep 02 jQuery
TypeScript中的方法重载详解
Apr 12 Javascript
Node Express用法详解【安装、使用、路由、中间件、模板引擎等】
May 13 Javascript
JS创建或填充任意长度数组的小技巧汇总
Oct 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 调试工具Debug Tools
2011/04/30 PHP
PHP操作mysql函数详解,mysql和php交互函数
2011/05/19 PHP
深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复
2013/08/05 PHP
php实现设计模式中的单例模式详解
2014/10/11 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
PHP实现简单搜歌的方法
2015/07/28 PHP
基于 Swoole 的微信扫码登录功能实现代码
2018/01/15 PHP
JavaScript实现Sleep函数的代码
2007/03/04 Javascript
一些Javascript的IE和Firefox(火狐)兼容性的问题总结及常用例子
2009/05/21 Javascript
jquery 操作两个select实现值之间的互相传递
2014/03/07 Javascript
通过url查找a元素应用案例
2014/04/29 Javascript
使用AngularJS 应用访问 Android 手机的图片库
2015/03/24 Javascript
sea.js常用的api简易文档
2016/11/15 Javascript
Highcharts+NodeJS搭建数据可视化平台示例
2017/01/01 NodeJs
BootStrap学习系列之布局组件(下拉,按钮组[toolbar],上拉)
2017/01/03 Javascript
详谈js中window.location.search的用法和作用
2017/02/13 Javascript
Vue.js展示AJAX数据简单示例讲解
2017/03/29 Javascript
一步步教你利用webpack如何搭一个vue脚手架(超详细讲解和注释)
2018/01/08 Javascript
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
2018/06/19 Javascript
解决IOS端微信H5页面软键盘弹起后页面下方留白的问题
2019/06/05 Javascript
VSCode 配置uni-app的方法
2020/07/11 Javascript
js实现简单的随机点名器
2020/09/17 Javascript
vuex Module将 store 分割成模块的操作
2020/12/07 Vue.js
win7 下搭建sublime的python开发环境的配置方法
2014/06/18 Python
python 把文件中的每一行以数组的元素放入数组中的方法
2018/04/29 Python
python保存网页图片到本地的方法
2018/07/24 Python
使用memory_profiler监测python代码运行时内存消耗方法
2018/12/03 Python
python操作日志的封装方法(两种方法)
2019/05/23 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
python 对一幅灰度图像进行直方图均衡化
2020/10/27 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
2020/12/04 Python
CSS3中的opacity属性使用教程
2015/08/19 HTML / CSS
学雷锋先进个人事迹
2014/05/26 职场文书
上课说话检讨书500字
2014/11/01 职场文书
党支部对转正的意见
2015/06/02 职场文书
2016孝老爱亲模范事迹材料
2016/02/26 职场文书