Help us understand the problem. What is going on with this article?

API Mockサーバ(node-easymock) の DockerImage を作ってみた

More than 1 year has passed since last update.

はじめに

Webアプリケーションをプロジェクトとして作成する際に、Front側チームとBackend側チームに分ける場合があります。
具体的に記載すると、Frontend側は、ブラウザで表示を行う html, css, javascript などを担当し、Backend側は、データの入出力などを行うAPI Serverを担当します。

Frontend側とBackend側を、効率よく並列で作業を進めるために、開発初期の段階で仮のAPI を実行する API Mockserverを構築することが多いと思います。

API MockserverをDockerで配布出来るようにしたため、手順を共有します。

DockerImage作成側:node-easymockのDockerImage作成

API Mockserverを提供するOSSは様々なものがありますが、今回はCyberAgentのnode-easymockを使用します。
これを採用した理由は、APIのResponse JSONを自由に定義することが出来るためです。

DockerFile作成

2018/9月の時点で nodeの最新tag 10.10.0 では、easymockをinstallすることが出来なったため、「node:5-slim」を使用しています。

WORKDIRとVOLUMEを /data としています。/data 配下に API ServerとしてResponseするjsonファイルを定義します。

mkdir ~/node-easymock
cd ~/node-easymock
cat <<'EOF' > ./Dockerfile
FROM node:5-slim
MAINTAINER sugimount <https://twitter.com/sugimount>

RUN npm install -g easymock@0.2.28

WORKDIR /data
VOLUME /data

EXPOSE 80
ENTRYPOINT ["node", "/usr/local/bin/easymock", "-p", "80", "-d", "/data"]
EOF

ImageBuild

docker build --tag=sugimount/qicoo-apimock:0.0.1 .

API の Responseのためのjson file作成

mkdir -p ~/node-easymock/api_responses/v1/questions/BosWT9EsdzgjPn
mkdir -p ~/node-easymock/api_responses/v1/users/IOodngp39890ba

# create a question
cat <<'EOF' > ~/node-easymock/api_responses/v1/questions_post.json
< @status 200
{
  "id": "BosWT9EsdzgjPn",
  "object": "question",
  "username": "sugimount",
  "event": "jkd1812",
  "program": "1",
  "comment": "kubernetesの〇〇について教えてください!",
  "created_at": "2018-09-08T09:07:09+09:00",
  "updated_at": "2018-09-08T09:07:09+09:00",
  "like": 0
}
EOF


# Retrieve a Question
cat <<'EOF' > ~/node-easymock/api_responses/v1/questions/BosWT9EsdzgjPn_get.json
{
  "id": "BosWT9EsdzgjPn",
  "object": "question",
  "username": "sugimount",
  "event": "jkd1812",
  "program": "1",
  "comment": "kubernetesの〇〇について教えてください!",
  "created_at": "2018-09-08T09:07:09+09:00",
  "updated_at": "2018-09-08T09:07:09+09:00",
  "like": 0
}
EOF

# Delete a Question
cat <<'EOF' > ~/node-easymock/api_responses/v1/questions/BosWT9EsdzgjPn_delete.json
{
  "id": "BosWT9EsdzgjPn",
  "object": "question",
  "deleted": true
}
EOF

# get all questions
cat <<'EOF' > ~/node-easymock/api_responses/v1/questions_get.json
{
  "object": "list",
  "data": [
    {
      "id": "BosWT9EsdzgjPn",
      "object": "question",
      "username": "sugimount",
      "event": "jkd1812",
      "program": "1",
      "comment": "kubernetesの〇〇について教えてください!",
      "created_at": "2018-09-08T09:07:09+09:00",
      "updated_at": "2018-09-08T09:07:09+09:00",
      "like": 0
    },
    {
      "id": "IOdeamop2243v",
      "object": "question",
      "username": "hhiroshell",
      "event": "jkd1812",
      "program": "1",
      "comment": "世界を平和にする方法を教えてください!",
      "created_at": "2018-09-08T09:09:09+09:00",
      "updated_at": "2018-09-08T09:09:09+09:00",
      "like": 0
    }
  ]
}
EOF

# like a question
cat <<'EOF' > ~/node-easymock/api_responses/v1/questions/BosWT9EsdzgjPn/like_put.json
{
  "id": "BosWT9EsdzgjPn",
  "object": "question",
  "username": "sugimount",
  "event": "jkd1812",
  "program": "1",
  "comment": "kubernetesの〇〇について教えてください!",
  "created_at": "2018-09-08T09:07:09+09:00",
  "updated_at": "2018-09-08T09:07:09+09:00",
  "like": 1
}
EOF

# Create a User
cat <<'EOF' > ~/node-easymock/api_responses/v1/users_post.json
{
  "id": "IOodngp39890ba",
  "object": "user",
  "user_session": "hogehoge",  
  "username": "sugimount",
  "type": "twitter",
  "created_at": "2018-09-08T09:07:09+09:00",
  "updated_at": "2018-09-08T09:07:09+09:00",
  "user_url": "https://twitter.com/sugimount"
}
EOF

# Retrieve a User
cat <<'EOF' > ~/node-easymock/api_responses/v1/users/IOodngp39890ba_get.json
{
  "id": "IOodngp39890ba",
  "object": "user",
  "user_session": "hogehoge",  
  "username": "sugimount",
  "type": "twitter",
  "created_at": "2018-09-08T09:07:09+09:00",
  "updated_at": "2018-09-08T09:07:09+09:00",
  "user_url": "https://twitter.com/sugimount"
}
EOF

# Delete a User
cat <<'EOF' > ~/node-easymock/api_responses/v1/users/IOodngp39890ba_delete.json
{
  "id": "IOodngp39890ba",
  "object": "users",
  "deleted": true
}
EOF

# List all Users
cat <<'EOF' > ~/node-easymock/api_responses/v1/users_get.json
{
  "object": "list",
  "data": [
    {
      "id": "IOodngp39890ba",
      "object": "user",
      "user_session": "hogehoge",  
      "username": "sugimount",
      "type": "twitter",
      "created_at": "2018-09-08T09:07:09+09:00",
      "updated_at": "2018-09-08T09:07:09+09:00",
      "user_url": "https://twitter.com/sugimount"
    },
    {
      "id": "Gdi4235niopan",
      "object": "user",
      "user_session": "gugehuge",  
      "username": "hhiroshell",
      "type": "twitter",
      "created_at": "2018-09-08T09:08:09+09:00",
      "updated_at": "2018-09-08T09:08:09+09:00",
      "user_url": "https://twitter.com/hhiroshell"
    }
  ]
}
EOF

コンテナの起動

docker run --name apimock --rm -d -p 80:80 -v ~/node-easymock/api_responses/:/data/ sugimount/qicoo-apimock:0.0.1

curlで取得。jsonファイルの中味をそのままResponseしているので、各種パラメータはResponseの内容には何も反映されないことを注意してください。

# create a question
curl -s -v -H "Content-Type: application/json" -X POST http://localhost/v1/questions -d '
{
  "event": "jkd1812",
  "program": "1",
  "comment": "kubernetesの〇〇について教えてください!"
}
'

# Retrieve a Question
curl -s -v -H "Content-Type: application/json" -X GET http://localhost/v1/questions/BosWT9EsdzgjPn

# Delete a Question
curl -s -v -H "Content-Type: application/json" -X DELETE http://localhost/v1/questions/BosWT9EsdzgjPn

# list all questions
curl -s -v -H "Content-Type: application/json" -X GET http://localhost/v1/questions

# like a question
curl -s -v -H "Content-Type: application/json" -X PUT http://localhost/v1/questions/BosWT9EsdzgjPn/like

# create a user
curl -s -v -H "Content-Type: application/json" -X POST http://localhost/v1/users -d '
{
  "username": "sugimount",
  "type": "twitter",
  "user_url": "https://twitter.com/sugimount"
}
'

# Retrieve a user
curl -s -v -H "Content-Type: application/json" -X GET http://localhost/v1/users/IOodngp39890ba

# Delete a User
curl -s -v -H "Content-Type: application/json" -X DELETE http://localhost/v1/users/IOodngp39890ba

# List all Users
curl -s -v -H "Content-Type: application/json" -X GET http://localhost/v1/users

コンテナの停止

docker kill apimock

DockerHubへアップロード

docker login
docker push sugimount/qicoo-apimock:0.0.1

利用側:コンテナを起動して、API Mockを利用

sugimountのGitHubをcloneします。GitHub上には、SampleとしてJSONのResponseファイルが含まれているため、このまま利用することが出来ます

git clone https://github.com/Sugi275/qicoo-api-mock.git ~/qicoo-api-mock
docker run --name apimock --rm -d -p 80:80 -v ~/qicoo-api-mock/api_responses/:/data/ sugimount/qicoo-apimock:0.0.1

下記コマンドで、localhost宛にMock API を実行することが出来ます

# create a question
curl -s -v -H "Content-Type: application/json" -X POST http://localhost/v1/questions -d '
{
  "event": "jkd1812",
  "program": "1",
  "comment": "kubernetesの〇〇について教えてください!"
}
'

# Retrieve a Question
curl -s -v -H "Content-Type: application/json" -X GET http://localhost/v1/questions/BosWT9EsdzgjPn

# Delete a Question
curl -s -v -H "Content-Type: application/json" -X DELETE http://localhost/v1/questions/BosWT9EsdzgjPn

# list all questions
curl -s -v -H "Content-Type: application/json" -X GET http://localhost/v1/questions

# like a question
curl -s -v -H "Content-Type: application/json" -X PUT http://localhost/v1/questions/BosWT9EsdzgjPn/like

# create a user
curl -s -v -H "Content-Type: application/json" -X POST http://localhost/v1/users -d '
{
  "username": "sugimount",
  "type": "twitter",
  "user_url": "https://twitter.com/sugimount"
}
'

# Retrieve a user
curl -s -v -H "Content-Type: application/json" -X GET http://localhost/v1/users/IOodngp39890ba

# Delete a User
curl -s -v -H "Content-Type: application/json" -X DELETE http://localhost/v1/users/IOodngp39890ba

# List all Users
curl -s -v -H "Content-Type: application/json" -X GET http://localhost/v1/users
sugimount
CloudNativeな色々をやっています / 投稿している内容は個人的な見解なので、所属組織とは関係ありません https://twitter.com/sugimount
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away