详解用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与Image加载事件(onload)、加载状态(complete)
Feb 14 Javascript
JavaScript中实现异步编程模式的4种方法
Sep 24 Javascript
jQuery聚合函数实例
May 21 Javascript
javascript实现删除前弹出确认框
Jun 04 Javascript
js实现input密码框提示信息的方法(附html5实现方法)
Jan 14 Javascript
javascript拖拽应用实例
Mar 25 Javascript
浅谈javascript中的Function和Arguments
Aug 30 Javascript
vue-cli项目中使用公用的提示弹层tips或加载loading组件实例详解
May 28 Javascript
vue 优化CDN加速的方法示例
Sep 19 Javascript
jquery实现联想词搜索框和搜索结果分页的示例
Oct 10 jQuery
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
Apr 17 Javascript
jquery树形插件zTree高级使用详解
Aug 16 jQuery
实现一个完整的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
第十三节 对象串行化 [13]
2006/10/09 PHP
PHP类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
yii实现使用CUploadedFile上传文件的方法
2015/12/28 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
2016/02/23 PHP
php curl优化下载微信头像的方法总结
2018/09/07 PHP
jquery移除、绑定、触发元素事件使用示例详解
2014/04/10 Javascript
获取中文字符串的实际长度代码
2014/06/05 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
Bootstrap面板学习使用
2017/02/09 Javascript
JS+HTML5 FileReader实现文件上传前本地预览功能
2020/03/27 Javascript
JS获取当前地理位置的方法
2017/10/25 Javascript
分析JavaScript数组操作难点
2017/12/18 Javascript
webpack源码之loader机制详解
2018/04/06 Javascript
Vue起步(无cli)的啊教程详解
2019/04/11 Javascript
antd-mobile ListView长列表的数据更新遇到的坑
2020/04/08 Javascript
浅谈JavaScript中this的指向更改
2020/07/28 Javascript
JavaScript实现页面高亮操作提示和蒙板
2021/01/04 Javascript
Python中规范定义命名空间的一些建议
2016/06/04 Python
Python使用分布式锁的代码演示示例
2018/07/30 Python
python异步存储数据详解
2019/03/19 Python
基于django channel实现websocket的聊天室的方法示例
2019/04/11 Python
Pycharm简单使用教程(入门小结)
2019/07/04 Python
Pyinstaller 打包exe教程及问题解决
2019/08/16 Python
python实现机器人卡牌
2019/10/06 Python
python实现ftp文件传输功能
2020/03/20 Python
微软英国官方网站:Microsoft英国
2016/10/15 全球购物
联想香港官方网站及网店:Lenovo香港
2018/04/13 全球购物
办公室主任四风问题对照检查材料思想汇报
2014/09/28 职场文书
户籍证明模板
2014/09/28 职场文书
单位工作证明
2014/10/07 职场文书
党的群众路线查摆剖析材料
2014/10/10 职场文书
银行贷款收入证明
2014/10/17 职场文书
一年之计:2019年下半年的计划
2019/05/07 职场文书
八年级作文之我的母亲
2019/12/10 职场文书
Nginx 过滤静态资源文件的访问日志的实现
2021/03/31 Servers
解决vue中provide inject的响应式监听
2022/04/19 Vue.js