JSONを返せるREST ServerモックのEasyMockを試してみる
背景
JMeterの動作を確認するために、モックサーバが必要
ゴール
- 自分で使用する際の、モックサーバの要件を定義する
- EasyMockが要件を満たせるか確認する
環境
- Type: Mac mini
- OS: OS X Yosemite (10.10.2)
- CPU: 2.6 GHz Intel Core i7
- Memory: 16 GB 1600 MHz DDR3
- Graphics: Intel HD Graphics 4000 1024 MB
- Python: 2.7.8
自分で使用する際の、モックサーバの要件を定義する
- JSONを返すことができる
- 80番ポートで開ける
- HTTPリスポンスコード, HTTPヘッダがそれぞれが設定できる
- APIのドキュメント生成してくれる
- API仕様ドキュメントなどからスクリプトを使って多数のAPIを定義できる
- リクエストヘッダ、ボディによって動作を変えれる
- APIによってサーバを変えれる
- クライアントから送られてくるPOST値が不正ならエラーを返す
EasyMockが要件を満たせるか確認する
インストール
$ npm install -g easymock
JSONを返すことができる
以下のようにする。取得できた。
$ cat user_get.json
{
"name": "taro",
"age": 22,
"comment": "Hi"
}
$ easymock
Server running on http://localhost:3000
Documentation at: http://localhost:3000/_documentation/
Logs at: http://localhost:3000/_logs/
別ターミナルで以下を実施
$ curl http://localhost:3000/user
{
"name": "taro",
"age": 22,
"comment": "Hi"
}
80番ポートで開ける
-p でポートを指定し、sudoで実行することにより指定できる
$ sudo easymock -p 80
Password:
Server running on http://localhost:80
Documentation at: http://localhost:80/_documentation/
Logs at: http://localhost:80/_logs/
HTTPリスポンスコード, HTTPヘッダがそれぞれが設定できる
指定することができる
$ cat change_status_code_get.json
< @status 301
< @header Location: http://www.cyberagent.co.jp
$ curl http://localhost:3000/change_status_code -v
* Hostname was NOT found in DNS cache
* Trying ::1...
* connect to ::1 port 3000 failed: Connection refused
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 3000 (#0)
> GET /change_status_code HTTP/1.1
> User-Agent: curl/7.37.1
> Host: localhost:3000
> Accept: */*
>
< HTTP/1.1 301 Not there anymore, Bro
< x-powered-by: Express
< location: http://www.cyberagent.co.jp
< content-type: text/html; charset=utf-8
< content-length: 0
< date: Sat, 18 Apr 2015 07:27:35 GMT
< connection: keep-alive
<
* Connection #0 to host localhost left intact
APIのドキュメント生成してくれる
以下にアクセスすると自動的に定義したAPIがドキュメントとなっている
http://localhost:3000/_documentation/
リクエスト、レスポンスのログもでる
http://localhost:3000/_logs/
API仕様ドキュメントなどからスクリプトを使って多数のAPIを定義できる
ドキュメントからjsonのレスポンスを定義したいのですが、json置くだけなので簡単にスクリプト組んでできそう。
リクエストヘッダ、ボディによって動作を変えれる
GETのパラメータによる値を受け取ることは可能。config.jsonを作りサーバ再起動で試す
$ cat config.json
{
"routes": [
"/item/:itemid"
]
}
$ cat item/itemid_get.json
{
"id": "#{itemid}",
"name": "wood"
}
サーバを再起動したあとに、以下のようにアクセス
$ curl http://localhost:3000/item/3
{
"id": "3",
"name": "wood"
}
POSTパラメータでも試してみる
$ cat item/itemid_post.json
{
"id": "#{itemid}",
"name": "wood"
}
$ curl http://localhost:3000/item/itemid -X POST -d "itemid=4"
{
"id": "4",
"name": "wood"
}
APIによってサーバを変えれる
config.jsonにproxyの項目を追加してサーバを再起動するだけで可能 ただし、proxyしたものはアクセスlogとしてのレスポンスは表示されない
$ cat config.json
{
"proxy": {
"server": "http://google.com",
"default": false,
"calls": {
"/google": { "get": true, "post": false }
}
},
"routes": [
"/item/:itemid"
]
}
$ curl http://localhost:3000/google
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/google">here</A>.
</BODY></HTML>
クライアントから送られてくるPOST値が不正ならエラーを返す
なさそう
結果
概ね満たせそうな感じ