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の記事"
}