REST API を Node.js と Express で作ってみる (2)
API の作成の基礎部分
記事(1)で試した内容で、'./routes/xxxx.js' として置かれたjsファイルが、RESTなURLで '/xxxx' として紐付けられてアクセス可能になる(アクセスされることで実行される)という仕組みは分かった。このルーティングの定義が ./myapp/app.js の中に書かれている。
カスタムURLに対応するAPIを作るために、./myapp/app.js に以下の2行を追記する。
..... var indexRouter = require('./routes/index'); var usersRouter = require('./routes/users'); var samplesRouter = require('./routes/samples'); // 〈--- 追加A var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); app.use(logger('dev')); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', indexRouter); app.use('/users', usersRouter); app.use('/samples', samplesRouter); // 〈--- 追加B // catch 404 and forward to error handler app.use(function(req, res, next) { next(createError(404)); }); .....
追加Aで、./routes/samples
にあるsamples.js
を読み込むルーターsamplesRouter
を定義(拡張子jsは省略できる)。
追加Bで、リクエストURLが '/samples' の時、そのsamplesRouter
に書いてある処理に振りわけられる。
その具体的な処理の内容は、./myapp/routesフォルダ以下の samples.jsというファイルに書いていく。
// samples.js var express = require('express'); var router = express.Router(); /* (A) * http://localhost:3000/samples でGETメソッドのリクエストを送ると、 JSON形式の文字列を返す。 */ router.get('/', function(req, res, next) { var param = {"key":"value=sample API"}; res.header('Content-Type', 'application/json; charset=utf-8') res.send(param); }); /* (B) * http://localhost:3000/samples/hello でGETメソッドのリクエストを送ると、JSON形式の文字列を返す。 */ router.get('/hello', function(req, res, next) { var param = {"result":"Hello World !"}; res.header('Content-Type', 'application/json; charset=utf-8') res.send(param); }); module.exports = router;
samples.js には、 (A) '/samples' と (B) '/samples/hello' の2つのリクエストURLに対応する2つのAPI処理が書いてある。 res.header('Content-Type', 'application/json; charset=utf-8')
と記述することで、レスポンスはJSON形式で返すという指示を出していることになる。res.send(param)
によってレスポンスを返している。
$ npm start
して 'http://localhost:3000/samples' にアクセスすると
{ "key": "value=sample API" }
というJSONが表示される。同様に'http://localhost:3000/samples/hello' にアクセスすると、
{ "result": "Hello World !" }
というJSONが表示される。
URIにパラメータをセットするAPI
リクエストURLを http://localhost:3000/hoge/value とすると、URI文字列から「value」で表されたパラメータを受け取って処理するAPI。 ./myapp/routes/samples.js のサンプルAPI(B)のブロックの後に、以下の内容(C)を追加して mayappアプリを再起動。
...................... /* (C) * http://localhost:3000/samples/hello/(任意の文字列) にGETメソッドのリクエストを送ると、JSON形式で(任意の文字列)を返す。 */ router.get('/hello/:place', function (req, res, next) { var param = {"result":"Hello "+ req.params.place + " !"}; res.header('Content-Type', 'application/json; charset=utf-8') res.send(param); }); module.exports = router;
http://localhost:3000/samples/hello/hoge
だと、
{ "result": "Hello hoge !" }
URIにクエリパラメータをセットするAPI
http://localhost:3000/samples/hello/hoge?q=val のような、URIのクエリパラメータを処理できるAPI。 ./myapp/routes/samples.js のサンプルAPI(C)を以下のように修正して、mayappアプリを再起動。
...................... /* (C) * http://localhost:3000/samples/hello/(任意の文字列) にGETメソッドのリクエストを送ると、JSON形式で(任意の文字列)を返す。 */ router.get('/hello/:place', function (req, res, next) { var param = {"result":"Hello "+ req.params.place + " !", "post date":req.query.date}; // <ー追加 res.header('Content-Type', 'application/json; charset=utf-8'); res.send(param); }); module.exports = router;
http://localhost:3000/samples/hello/hoge?date=20190813
に対して次のJSONが返ってくる。
{ "result": "Hello hoge !", "post date": "20190813" }
POSTメソッドのリクエストを受けるAPI
POSTメソッドを受けるAPIのサンプル。 ./myapp/routes/samples.js に下記のサンプルAPI(D)を追加して、mayappアプリを再起動。
...................... /* (D) * http://localhost:3000/samples にPOSTメソッドのリクエストを投げると、JSON形式で文字列を返す。 */ router.post('/', function(req, res, next) { var param = {"value":"Accepted POST method request","body value":req.body.post}; res.header('Content-Type', 'application/json; charset=utf-8'); res.send(param); }); module.exports = router;
Chromeの拡張機能 Advanced REST client を使って確認する。
http://localhost:3000/samples
で、メソッドにPOSTを選び、Header content type は application/json 、 Body をクリックし Editor view を Row input にして FORMAT JSON の下のエディター部分に jsonデータ(キー:値)を指定する。ここでは{"post":"2019/08/13の記事"}
と書いて SEND
戻り値は次のようなJSONデータ
{ "value": "Accepted POST method request", "body value": "2019/08/13の記事" }