Restify实践
来源:互联网 发布:淘宝哪里申请商标认证 编辑:程序博客网 时间:2024/05/29 04:37
在项目里面,我网站用的是2层结构:UI + WebService(REST API),这样的好处是UI和后端可以完全分离。UI我用的是expressJs,后端Service层用的也是expressJs。今天看到一个轻量级的、专为REST API定制的框架,restify(详细文档:http://mcavage.github.io/node-restify)。restify应该是基于connect的,和expressJs用法也差不多,只不过,有少许区别,好处是,他支持server、client两种!server可以是一个http server、json server、string server(区别是返回的body类型是application/plain, application/json, ...)。而且他还支持带version支持的RESTFUL API(使用header: accept-version: ~1控制)。下面就是使用代码:
var restify = require('restify') , routes = require('./routes');var server = restify.createServer({ name: 'CER Web Service', versions: ['1.0.0']});server.use(restify.pre.userAgentConnection()); // work around for curlserver.use(restify.acceptParser(server.acceptable));server.use(restify.queryParser());server.use(restify.bodyParser());// static files: /, /index.html, /images...server.get(/^\/((.*)(\.)(.+))*$/, restify.serveStatic({ directory: 'public', default: "index.html" }));// testing the serviceserver.get('/test', function (req, res, next) { res.send("testing..."); next();});server.get('/products', routes.product_list);server.get('/sendEmail', routes.sendEmail);server.get('/:productId/top_crash/week/:weekId', routes.top_crash);server.get('/:productId/weekly_crash/week/:weekId', routes.weekly_crash);server.get('/:productId/weekly_crash_per_user/week/:weekId', routes.weekly_crash_per_user);server.get('/:productId/related_products', routes.related_product_list);server.get('/:productId/weeks', routes.week_list);server.get('/:productId/fix_rate/week/:weekId', routes.fix_rate);server.get('/:productId/os_breakdown/week/:weekId', routes.os_breakdown);server.get('/:productId/bucket/week/:weekId', routes.bucket);server.listen(8080, function () { console.log('%s listening at %s', server.name, server.url);});
第一步是创建server对象,你可以传入你所支持的版本数组,versions!(不用使用version属性,因为有bug,在调用server.toString()的时候,会crash)。接着就是一些中间件:
1. pre.userAgentConnection():这个是为处理keep-alive的curl命令的。
2. acceptParser():返回支持信息,比如json, plain等。
接下来就是路由功能了:
1. serveStatic:这个需要讲一下,和expressJs不同,对于静态文件的获取,expressJs是调用use(),并传入一个static()中间件的,但是restify要求,一定要映射到一个路径上去,所以只能使用get。
2. 最后一个参数next()不能省略。
3. 之后的一些get,都和expressJs一模一样了,完全相同。
从expressJs移植到restify很方便,对于我来说,只是修改了app.js,然后删除了一些无用的目录即可。
接下来看看client端,以前我是使用http.get()来访问页面的,现在可以使用restify提供的client类:
var http = require('http') , util = require('util') , assert = require('assert') , restify = require('restify');var jsonClient = restify.createJsonClient({ url: "http://localhost:8080", version: "1.0.0"});module.exports = { host: "http://localhost:8080", products: "/products", relatedProducts: "/{productId}/related_products", weeks: "/{productId}/weeks", weeklyCrashCount: "/{productId}/weekly_crash/week/{weekId}", weeklyCrashCountPerUser: "/{productId}/weekly_crash_per_user/week/{weekId}", topCrashCommands: "/{productId}/top_crash/week/0", fixRate: "/{productId}/fix_rate/week/{weekId}", osBreakdown: "/{productId}/os_breakdown/week/{weekId}", bucket: "/{productId}/bucket/week/{weekId}", getRequestUrl: function (url, keyValues) { for (var key in keyValues) { url = url.replace("{" + key + "}", keyValues[key]); } return url; }, getCall: function (url, callback) { jsonClient.get(url, function (err, req, res, obj) { if (err) { console.log(err); callback(err, res.statusCode); } else { callback(undefined, obj); } }); }};
我先是创建了一个jsonClient,然后告诉他,版本是1.0.0,当然也可以传入*表示所有版本通吃。在getCall()里面,我调用jsonClient.get(),其callback的最后一个参数会传给我一个对象,哈哈,这个就是json对象!方便吧!
其实,你看看restify的实现,也超简单的,就是从服务器端拿到数据,然后用JSON.parse()将他转换成js的对象而已。
- Restify实践
- Restify
- 关于 restify
- restify Routing
- Restify一
- Restify中文编码问题
- restify Server API
- 使用Restify+superagent做数据转发
- 使用restify构建纯粹的rest服务
- Simple example - Node.js, Restify, MongoDb and Mongoose
- node.js使用restify开发REST web services
- Ubuntu使用Nginx代理Restify创建的WebApp
- 网站重构——轻量化的网站架构设计三,angular restify
- [菜鸟试水]关于Nodejs搭建后台API服务(Mysql-Restify)
- Day 27: Restify —— 在Node.js中构建正确的REST Web服务
- Restify —— 在Node.js中构建正确的REST Web服务
- 【个人笔记重点,不作为参考】主题:restify搭建模拟RESTful API
- 实践
- GDB同步显示源代码——layout
- Fiddler (三) Composer创建和发送HTTP Request
- 分布式数据库系统---商旅预定系统的实现(7)
- 指针和多维数组
- linux下搭建svn本地服务器
- Restify实践
- dede搜索引擎
- index_join
- 给oracle数据库用户加锁和解锁
- jquery.qqFace.js 页面标签/jquery
- java----IO流
- js控制select大全
- js控制select大全
- 代码分析工具推荐Understand