restify是允许你打造正确的REST类的web service的node.js特色模块。它或多或少有意的参照express上具体的API去写node.js的web应用。
为什么使用restify而不是express?
相比其他问题,这个问题问我的人更多了,因此,我将正好在这文章最前面来说明。
Express的使用案例是把浏览器应用程序作为目标而且包含了像templating和rendering功能的很多函数来支撑。Restify却没有。
Restify的存在是为了让你制定可维护和看得见的严谨的API服务。如果你运行的平台支持DTrace, 那么Restify带来的自动DTrace会支持你所有的handlers。
简言之,我之所以写restify是我需要一个在使用http交互中能给我绝对控制性和全面观察我应用的潜在因素和特征的框架。如果你不需要这些或者不关心这些方面,那么restify可能不适合你。
为了实时聊天、讨论、支持,请加入#restify
的IRC频道: irc.freenode.net
。
关于这个教程
本教程提供了综合全面文档说明:用restify写REST API的服务端, 客户端更容易调用REST APIs接口以及DTrace的集成,这些都呈现在restify里。
值得注意的是本教程是基于restify2.x版本的;这些版本并不能反向向后兼容0.x和1.x的版本。
如果你从早期的restify做迁移,请查看1.4 to 2.0的迁移提示。
约定
一些内容格式,例如:curl localhost:8080
是一个命令行例子,你可以运行在一个shell环境中。其他所有例子和信息格式为GET /foo HTTP/1.1
安装
$ npm install restify
服务server API
一个很著名原始的echo服务:
var restify = require('restify');
function respond(req, res, next) {
res.send('hello ' + req.params.name);
next();
}
var server = restify.createServer();
server.get('/hello/:name', respond);
server.head('/hello/:name', respond);
server.listen(8080, function() {
console.log('%s listening at %s', server.name, server.url);
});
试着敲入curl命令体验下restify的效果:
命令
$ curl -is http://localhost:8080/hello/mark -H 'accept: text/plain'
输出
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 10
Date: Mon, 31 Dec 2012 01:32:44 GMT
Connection: keep-alive
hello mark
命令
$ curl -is http://localhost:8080/hello/mark
输出
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 12
Date: Mon, 31 Dec 2012 01:33:33 GMT
Connection: keep-alive
"hello mark"
命令
curl -is http://localhost:8080/hello/mark -X HEAD -H 'connection: close'
输出
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 12
Date: Mon, 31 Dec 2012 01:42:07 GMT
Connection: close
在默认情况下,curl用Connection: keep-alive
。为了使HEAD方法能立刻返回,你将必须传Connection: close
参数进去。
自从curl常被用于REST APIs,restify提供了一个插件去使用curl的特性。无论用户代理是否是curl,这个插件都会检查,如果它是,则会设置连接头为close
且移除Content-Length
的头部header.
server.pre(restify.pre.userAgentConnection());
查看更多pre方法的信息
创建服务server
创建一个服务是非常简单的,你仅仅需要调用createServer
API,此API需要传入一个option对象(属性列表如下,listen()
函数也有相同的参数属性。
var restify = require('restify');
var server = restify.createServer({
certificate: ...,
key: ...,
name: 'MyApp',
});
server.listen(8080);
选项 | 类型 | 描述 |
---|---|---|
certificate | String | 如果你想要创建https服务,则需要传递在PEM编码的证书 |
key | String | 如果你想要创建https服务,则需要传递在PEM编码的证书 |
formatters | Object | res.send()默认返回格式 |
log | Object | 可以无需required即可传递bunyan实力对象 |
name | String | 默认会设置在Server的响应头里,缺省值为restify |
spdy | Object | node-spdy所需要的属性 |
handleUpgrades | Boolean | 在http服务中与upgrade事件挂钩, |
httpsServerOptions | Object |
未完待续…