azure app service で kintone アプリデータ公開その３（REST API）

azure app service で kintone アプリデータ公開その３です。
kintone アクセス用に、REST API を作ってみます。

# 概要

 [azure app service で kintone アプリデータ公開その２（環境変数利用）](https://qiita.com/rex0220/items/38df7a061d267ffd495b)の続きです。
ブラウザ上で、kintone アプリデータをグリッド表示する場合に、kintone アプリデータを取得する方法が問題になります。
「ページ作成時、JavaScript の変数にレコード情報を入れる」、「DOM上にレコード情報を入れる」なども考えられます。
ただしページ制御なども考えるとkintone と同様に REST API でレコード取得したほうがよさそうです。
幸いにも node.js, Express では、簡単に REST API が構築できるようですので、試作してみます。

# 参考情報

node.js, Express だけで、REST API が構築できそうです。

- [Node.jsを利用した単純なREST APIの書き方](https://qiita.com/markusveeyola/items/878cfa5c3c7982ceb54d)
- [Node.jsとExpressでWeb APIを作ってみよう](https://sbfl.net/blog/2018/08/25/nodejs-express-webapi/)
- [Node.jsのフレームワーク、Expressを使ってRESTサーバーを書いてみる](https://kazuhira-r.hatenablog.com/entry/20180211/1518362419)

# 作成する REST API

とりあえず、kintone の一覧画面のようなものを作るための、複数レコードを返す REST API を作成します。
REST APIの呼び出しは、「/api/APIバージョン/機能名」のような体系が一般的のようなので、下記の名前にします。
※kintone REST API は、「/k/v1/record.json」などになっています。

- /api/v1/list

## app.js の変更点

/api/v1/~ は、apiv1.js で処理することにして、app.js に apiv1Router 処理を追加します。

```app.js
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
require('dotenv').config();

var indexRouter = require('./routes/index');
var apiv1Router = require('./routes/apiv1');
var usersRouter = require('./routes/users');
var customerRouter = require('./routes/customer');
var listRouter = require('./routes/list');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

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('/api/v1', apiv1Router);
app.use('/users', usersRouter);
app.use('/customer', customerRouter);
app.use('/list', listRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;
```

## apiv1.js の追加

'/api/v1/list' の 'GET' で、呼び出されると、kintone REST API の複数レコード取得をそのまま呼び出しているだけです。
res.json(resp); で、返すと json 形式になります。

```apiv1.js
var express = require('express');
var router = express.Router();
const kintone = require('@kintone/kintone-js-sdk');
const kintoneConnection = require('./kintoneConnection');

// GET LIST
router.get('/list', function(req, res, next) {
    // console.log('/list req', req);
    const kintoneRecord = new kintone.Record({ connection: kintoneConnection });  
    kintoneRecord.getRecords(req.query).then((resp) => {
    //   console.log(resp);
      res.json(resp);
    }).catch((err) => {
      // The promise function always reject with KintoneAPIExeption
      console.log('kb-list-api err', err);
      res.json(err);
    });
});

module.exports = router;
```

# REST API の実行

ローカルPC上で、デバッグ実行すると、ブラウザー上で直接 REST API を呼び出すことができます。

http://localhost:3000/api/v1/list?app=549

表示結果　kintone REST API の実行結果が返されています。
ただこのままでは、いろいろな kintone アプリデータが直接取得できてしまいます。
運用するには、ログイン・セッション管理などをしないといけませんね。

```.json
{"records":[{"備考":{"type":"MULTI_LINE_TEXT","value":""},"更新者":{"type":"MODIFIER","value":{"code":"Alex2013","name":"Alex2013"}},"作成者":{"type":"CREATOR","value":{"code":"Alex2013","name":"Alex2013"}},"郵便番号":{"type":"SINGLE_LINE_TEXT","value":"3300041"},"$revision":{"type":"__REVISION__","value":"1"},"部署名":{"type":"SINGLE_LINE_TEXT","value":"ソリューション営業グループ"},"担当者名":{"type":"SINGLE_LINE_TEXT","value":"森 惇"},"メールアドレス":{"type":"LINK","value":"mori_jun@example.com"},"更新日時":{"type":"UPDATED_TIME","value":"2019-07-10T12:23:00Z"},"顧客ランク":{"type":"DROP_DOWN","value":"A"},"record_no":{"type":"RECORD_NUMBER","value":"20"},"住所":{"type":"SINGLE_LINE_TEXT","value":"埼玉県浦和市××××"},"電話番号":{"type":"LINK","value":"090-××××-××××"},"FAX":{"type":"LINK","value":"050-××××-××××"},"作成日時":{"type":"CREATED_TIME","value":"2019-07-10T12:23:00Z"},"会社名":{"type":"SINGLE_LINE_TEXT","value":"林田商会"},"$id":{"type":"__ID__","value":"20"}},
...
```

# 次にやること

- [azure app service で kintone アプリデータ公開その４（JS API）](https://qiita.com/rex0220/items/c9604249361510444d1a)

# あとがき

REST API の作成も簡単ですね。コード量も少なくてわかりやすいと思います。
あとあと CRUD の各REST API も追加してみたいと思います。