概要

Web APIの開発をするのにapi blueprintとdrakovを利用するとモックサーバを簡単に立ち上げられると聞いて試してみました。

api blueprint
https://apiblueprint.org/

こちらの記事を参考にさせてもらいました。感謝!

API BlueprintとdrakovとdreddでAPIドキュメントを書きつつモックサーバを立ててさらにテストを走らせる
https://arata.hatenadiary.com/entry/2018/03/22/204723

今回構築した環境をGitHubにUPしていますので、ご参考ください。
https://github.com/kai-kou/api-blueprint-use-drakov

環境構築

いつもDockerを利用しているので、Docker環境を用意します。
こちらは趣味なので、ローカルでもOKです。
node.jsが利用できるようにイメージを指定します。

> mkdir 任意のディレクトリ
> cd 任意のディレクトリ
> touch Dockerfile
> touch docker-compose.yml

Dockerfile

FROM node:latest

WORKDIR /projects

docker-compose.yml

version: '3'

services:
  api:
    build: .
    ports:
      - "3000:3000"
    volumes:
      - ".:/projects"
    tty: true
> docker-compose up -d
> docker-compose exec api bash

API定義を用意する

api blueprintの仕様でmdファイルを作成します。

> mkdir md
> touch md/sample.md

md/sample.md

# GET /message
+ Response 200 (text/plain)

        Hello World!

モックサーバを立ち上げる

環境が準備できたらdrakovをインストールします。

コンテナ内

> npm install -g drakov

インストールできたか確認します。

コンテナ内

> drakov
[INFO] No configuration files found
[INFO] Loading configuration from CLI
Usage:
  ./drakov -f <path to blueprint> [-p <server port|3000>]

Example:
  ./drakov -f ./*.md -p 3000
(略)

それでは、モックサーバを起動します。Dockerコンテナ内で実行する場合、--public オプションを付けないとコンテナ外からアクセスできないのでご注意ください。

コンテナ内

> drakov -f md/sample.md --public

[INFO] No configuration files found
[INFO] Loading configuration from CLI
   DRAKOV STARTED
[LOG] Setup Route: GET /message
   Drakov 1.0.4      Listening on port 3000
   PUBLIC MODE      running publicly

アクセスしてみます。

> curl -v http://localhost:3000/message
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 3000 (#0)
> GET /message HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< X-Powered-By: Drakov API Server
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true
< Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept
< Content-Type: text/plain; charset=utf-8
< Content-Length: 13
< ETag: W/"d-oLZZOWcLwsAQ9NXWoLPk5FkPuSs"
< Date: Fri, 31 Aug 2018 09:07:01 GMT
< Connection: keep-alive
<
Hello World!

はい。

テキストを返しているだけだとつまらないので、JSONを返すようにしてみます。

md/sample.md

# GET /message
+ Response 200 (application/json)

        [
          {
            "id": "1",
            "hoge": "ほげ",
            "fuga": "ふが"
          }
        ]
> curl -v http://localhost:3000/message
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 3000 (#0)
> GET /message HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< X-Powered-By: Drakov API Server
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true
< Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept
< Content-Type: text/plain; charset=utf-8
< Content-Length: 13
< ETag: W/"d-oLZZOWcLwsAQ9NXWoLPk5FkPuSs"
< Date: Fri, 31 Aug 2018 09:08:46 GMT
< Connection: keep-alive
<
Hello World!

変わらないですね。--watch オプションを付けて立ち上げないとだめみたいです。

コンテナ内

> drakov -f md/sample.md --public --watch
[INFO] No configuration files found
[INFO] Loading configuration from CLI
   DRAKOV STARTED
[LOG] Setup Route: GET /message
   Drakov 1.0.4      Listening on port 3000
   PUBLIC MODE      running publicly

この状態で、mdファイルを保存すると。。。

[CHANGE] md/sample.md Restarting 1
   DRAKOV STOPPED
   DRAKOV STARTED
[LOG] Setup Route: GET /message
   Drakov 1.0.4      Listening on port 3000
   PUBLIC MODE      running publicly

反応してくれました^^

改めてアクセスしてみます。

> curl -v http://localhost:3000/message
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 3000 (#0)
> GET /message HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< X-Powered-By: Drakov API Server
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true
< Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept
< Content-Type: application/json; charset=utf-8
< Content-Length: 70
< ETag: W/"46-YVQUXYNINs/mq4ldrdja8KnDu00"
< Date: Fri, 31 Aug 2018 09:13:09 GMT
< Connection: keep-alive
<
[
  {
    "id": "1",
    "hoge": "ほげ",
    "fuga": "ふが"
  }
]

やったぜ。

最後に複数mdファイルがあったらどうなるか見ておきます。

> cp md/sample.md md/sample2.md
> vi md/sample2.md

md/sample2.md

# GET /message2
+ Response 200 (application/json)

        [
          {
            "id": "1",
            "hoge": "ほげ",
            "fuga": "ふが"
          }
        ]

コンテナ内

> drakov -f "md/*.md" --public --watch

[INFO] No configuration files found
[INFO] Loading configuration from CLI
   DRAKOV STARTED
[LOG] Setup Route: GET /message
[LOG] Setup Route: GET /message2
   Drakov 1.0.4      Listening on port 3000
   PUBLIC MODE      running publicly

ちゃんと認識してくれました。けどなぜか"" で括らないと最初に見つけたファイルのみ読み込むという謎仕様でした^^

コンテナ内

> drakov -f md/*.md --public --watch

[INFO] No configuration files found
[INFO] Loading configuration from CLI
   DRAKOV STARTED
[LOG] Setup Route: GET /message
   Drakov 1.0.4      Listening on port 3000
   PUBLIC MODE      running publicly

それではapi blueprintを利用した、良きAPI開発ライフを^^

参考

api blueprint
https://apiblueprint.org/

API BlueprintとdrakovとdreddでAPIドキュメントを書きつつモックサーバを立ててさらにテストを走らせる
https://arata.hatenadiary.com/entry/2018/03/22/204723

元記事はこちら

api blueprintとdrakovを利用してAPIモックサーバを立ち上げる