概要
Web APIの開発をするのにapi blueprintとaglio+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-aglio-darkov
環境構築
Docker環境を用意します。
> mkdir 任意のディレクトリ
> cd 任意のディレクトリ
> touch Dockerfile
> touch docker-compose.yml
node.jsが利用できるようにイメージを指定します。
aglioとdrakovもインストールしておきます。
FROM node:latest
WORKDIR /projects
RUN npm install -g aglio --unsafe-perm
RUN npm install -g drakov
command
でaglioとdrakovのそれぞれが起動するようにコマンドを指定しておきます。
version: '3'
services:
aglio:
build: .
ports:
- "3000:3000"
volumes:
- "./md:/projects"
tty: true
command: aglio --theme-variables slate -i index.md -s -h 0.0.0.0
drakov:
build: .
ports:
- "3001:3001"
volumes:
- "./md:/projects"
tty: true
command: drakov -f "**/*.md" --public --watch --p 3001
ドキュメントを用意する
Docker起動前にAPI仕様を記述したファイルを用意しておきます。
> mkdir md
> touch md/index.md
> touch md/sample.md
md/index.mdはAglioで複数mdファイルを取り扱う際に利用します。
aglioで**/*.md
と指定できたら良いのですが、Docker-compose.ymlで指定するとうまく起動しませんでした。
<!-- include(sample.md) -->
# GET /message
+ Response 200 (text/plain)
Hello World!
Dockerコンテナの立ち上げ
準備ができましたので、Dockerコンテナを立ち上げます。
> docker-compose up -d
起動したか確認してみます。
> docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------------------------------------
api-blueprint-use-aglio-darkov_aglio_1 aglio --theme-variables sl ... Up 0.0.0.0:3000->3000/tcp
api-blueprint-use-aglio-darkov_drakov_1 drakov -f **/*.md --public ... Up 0.0.0.0:3001->3001/tcp
はい。
それでは、それぞれアクセスしてみます。
> open http://localhost:3000/
> curl -v http://localhost:3001/message
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 3001 (#0)
> GET /message HTTP/1.1
> Host: localhost:3001
> 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: Mon, 03 Sep 2018 02:19:27 GMT
< Connection: keep-alive
<
Hello World!
* Connection #0 to host localhost left intact
はい。それぞれ起動しています。
ログでも確認してみます。
> docker-compose logs aglio
aglio_1 | Server started on http://0.0.0.0:3000/
aglio_1 | Rendering index.md
aglio_1 | Socket connected
aglio_1 | Refresh web page in browser
aglio_1 | Socket connected
> docker-compose logs drakov
drakov_1 | DRAKOV STOPPED
drakov_1 | DRAKOV STARTED
drakov_1 | [LOG] Setup Route: GET /message
drakov_1 | Drakov 1.0.4 Listening on port 3001
drakov_1 | PUBLIC MODE running publicly
drakov_1 | [LOG] GET /message
drakov_1 | [MATCHING] by url pattern: /message MATCHED
drakov_1 | [DRAKOV] GET /message
drakov_1 | [LOG] GET /message
drakov_1 | [MATCHING] by url pattern: /message MATCHED
drakov_1 | [DRAKOV] GET /message
md/sample.mdの内容を変更してみます。
# GET /message
+ Response 200 (text/plain)
Hello World!!!!!
変更したらログを確認してみます。
> docker-compose logs aglio
aglio_1 | Updated sample.md
aglio_1 | Rendering index.md
aglio_1 | Refresh web page in browser
aglio_1 | Updated sample.md
aglio_1 | Rendering index.md
aglio_1 | Refresh web page in browser
> docker-compose logs drakov
drakov_1 | [CHANGE] sample.md Restarting 6
drakov_1 | DRAKOV STOPPED
drakov_1 | DRAKOV STARTED
drakov_1 | [LOG] Setup Route: GET /message
drakov_1 | Drakov 1.0.4 Listening on port 3001
drakov_1 | PUBLIC MODE running publicly
変更を検知してくれていますね。
> open http://localhost:3000/
> curl -v http://localhost:3001/message
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 3001 (#0)
> GET /message HTTP/1.1
> Host: localhost:3001
> 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: 17
< ETag: W/"11-dSdq9EnT5dkGNunArS5pSGaVctI"
< Date: Mon, 03 Sep 2018 02:23:53 GMT
< Connection: keep-alive
<
Hello World!!!!!
* Connection #0 to host localhost left intact
それぞれ変更が反映されています。
mdファイルを追加してみます。
> touch md/sanple2.md
> vi md/sanple2.md
> vi md/index.md
# GET /message2
+ Response 200 (text/plain)
Hello World!!!
<!-- include(sample.md) -->
<!-- include(sample2.md) -->
追加したら反映されているか確認してみます。
> open http://localhost:3000
> curl -v http://localhost:3001/message2
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 3001 (#0)
> GET /message2 HTTP/1.1
> Host: localhost:3001
> 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: 16
< ETag: W/"10-DyKYcjpVzlBcpDK0SJCKLaPPxvE"
< Date: Mon, 03 Sep 2018 02:29:31 GMT
< Connection: keep-alive
<
Hello World!!!!
* Connection #0 to host localhost left intact
はい。いい感じです。
たまにファイル更新や追加時にプロセスが落ちてしまうことがありました。
その際には以下コマンドで再起動すると復帰できます。
> docker-compose start
Starting aglio ... done
Starting drakov ... done
それでは、良きapi blueprint開発ライフを^^