node.jsでRESTful API作る
node.js触るのは5ヶ月ぶりくらいなのでリハビリも兼ねて。
まだRESTなAPI作ったこと無いな・・
ということで、アプリケーションサーバとしてnode.jsを選んだときに
RESTfulなAPIを返すサーバを作ってみます。
ちなみにほぼ
node.jsでREST APIを作るのに最適なexpress-resource | Inhale n' Exhale
の内容に沿ってますハイ。
【追記】
express4版はこちら。
express4でRESTful API作る - yutaponのブログ
express-resourceをインストール
前回express3でMVCのひな形を作ったので、
それにのっかる形で作っていきます。
express-resourceを使うと簡単にできそうです。
https://github.com/visionmedia/express-resource
express-resourceをインストールします。
$ npm install --save express-resource
npm install するときは--saveオプションを付けると
package.jsonのdependenciesに自動で追記してくれるので便利です。
--save-devオプションを付けるとdevDependenciesに
追記されます。デバッグ用のモジュールなどはこちらを付けましょう。
app.jsを編集
インストールしたらapp.jsを編集します。
var express = require('express') , resource = require('express-resource') // 追加 , routes = require('./routes') , user = require('./routes/user') , http = require('http') , path = require('path'); var app = express(); // いろいろ設定があって・・ app.get('/', routes.index); //app.get('/users', user.index); // ←これが、↓こう変わる app.resource('users', require('./routes/user')); // 追加 http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); });
routes/user.jsを編集
デフォルトで書かれていたものを消して、下記のように書き換えました。
module.exports = { index: function(req, res){ res.send("index: called as GET method"); } ,new: function(req, res){ res.send("new: called as GET method"); } ,create: function(req, res){ res.send("create: called as POST method"); } ,show: function(req, res){ res.send("show: called as GET method"); } ,edit: function(req, res){ res.send("edit: called as GET method"); } ,update: function(req, res){ res.send("update: called as PUT method"); } ,destroy: function(req, res){ res.send("destroy: called as DELETE method"); } };
この時点で試せるようになっているはずなので
サーバーを起動していろいろ試してみて下さい。
$ node app.js
それぞれのメソッドは、下記のURLスキームと一致します。
GET /users -> index GET /users/new -> new POST /users -> create GET /users/:user -> show GET /users/:user/edit -> edit PUT /users/:user -> update DELETE /users/:user -> destroy
ブラウザのURL欄から、http://localhost:3000/users/123とアクセスしたら
routes/user.jsのshowメソッドが呼ばれます。
この時、showメソッド内ではユーザIDを参照したいわけですが、
req.params.userで123の部分を取得することができます。
userって参照名が分かりにくい場合は、app.jsのresourceの第三引数を指定しましょう。
app.resource('users', require('./routes/user'), { id: 'id' }); // 第三引数を追記
これで、req.params.idで指定されたidを取得することが出来ます。
JSON形式でレスポンスを返す
今時のAPIはJSONで返すのがデフォ。
GithubのREADME見ると、JSONとXMLとで動的に変える方法が載ってるけど、
今回はJSONに絞る。
app.js の resourceの第三引数に追記する。
app.resource('users', require('./routes/user'), { id : 'id' ,format : 'json' // 追記 });
あとはres.sendするときにJSONオブジェクトを返すようにするだけ。
たとえば、/user/123でアクセスされたら
res.json({ "status": 200 ,"id": 123 ,"name": yutapon });
みたいな感じでレスポンスを返すようにする。
おわりに
これでRESTfulなAPIを作る準備が整いました。
今のところチャットとかTODOとか簡単なものを作ろうとしてますが、
たどり着くのはまだまだ先になりそうです。
これからアプリのロジックを組んでいく前に、
まずはテスト環境を整えます。
という訳で、次回はtestem使ってテスト回です。