はじめに
琴葉ちゃん、お誕生日おめでとう! nikkieです。
直近のめちゃハマり記です。
Response Templatingが全然動かない〜とハマってました。
目次
- はじめに
- 目次
- wiremock-docker
- wiremock-dockerで「Response Templating」
- 動作確認! あれ、テンプレートが機能しない?
- docker runするときの引数の設定!
- ハマった副産物:WireMockの拡張の指定の仕方
- 終わりに
wiremock-docker
WireMockを使ってHTTPサーバをモックできます。
動かし方は色々ありますが、docker run
でも動かせます1。
Dockerイメージはこちら
https://hub.docker.com/r/wiremock/wiremock
wiremock-dockerで「Response Templating」
リクエストに含まれるデータを参照してレスポンスを設定したくなりました。
「Response Templating」のドキュメントを参照します。
上で引いた記事ではちさたきを楽しんだので、今回はそれを拡張していきましょう。
GET /chinanagoでクエリパラメタname込みでリクエストされている前提で、「name
さん、さかなー🐟」と返すように設定します。
. ├── __files/ # 空で大丈夫です └── mappings/ └── takina.json
takina.json
{ "request": { "urlPath": "/chinanago", "method": "GET", "queryParameters": { "name": { "matches": ".*" } } }, "response": { "status": 200, "body": "{{ request.query.name }}さん、さかなー🐟", "transformers": ["response-template"] } }
リクエストの設定
- urlPathもポイント!
- https://wiremock.org/docs/request-matching/#equality-matching-on-the-path-only
- urlだとクエリパラメタを含んだ
/chinanago?name=chisato
とマッチするかをみるみたいでした
- 正規表現を使って「nameというクエリパラメタがあれば」を表しています
- クエリパラメタnameが正規表現
.*
(=任意の文字列)にマッチすれば - https://wiremock.org/docs/request-matching/#regular-expression
- クエリパラメタnameが正規表現
レスポンスの設定
https://wiremock.org/docs/response-templating/#applying-templating-in-local-mode を参照しました
- transformersに
response-template
を指定- レスポンス中の
"{{ 変数 }}"
が展開されるという理解です
- レスポンス中の
- nameというクエリパラメタは
request.query.name
で参照できます- https://wiremock.org/docs/response-templating/#the-request-model
request.query.<key>
- First value of a query parameter
動作確認! あれ、テンプレートが機能しない?
WireMockを立てます
docker run --rm -it \ -p 8080:8080 \ --name chisataki-mock \ -v $PWD:/home/wiremock \ wiremock/wiremock:3.1.0-1
別のシェルでリクエストを送ってみましょう。
(docker runに-d
を渡してもいいのですが、ログを見たかったので渡していません)
$ curl 'http://localhost:8080/chinanago?name=chisato' {{ request.query.name }}さん、さかなー🐟
あれ? {{ request.query.name }}
が展開されてない...
docker runするときの引数の設定!
--global-response-templating
を渡す必要がありました。
docker run --rm -it \ -p 8080:8080 \ --name chisataki-mock \ -v $PWD:/home/wiremock \ wiremock/wiremock:3.1.0-1 \ --global-response-templating
$ curl 'http://localhost:8080/chinanago?name=chisato' chisatoさん、さかなー🐟
ちんあなごー🙌
--global-response-templating
とは
https://wiremock.org/docs/standalone/java-jar/#command-line-options より
--global-response-templating
: Render all response definitions using Handlebars templates.
「Response Templating」のドキュメントにはコマンドラインオプションのドキュメントへの言及もあります。
https://wiremock.org/docs/response-templating/#enablingdisabling-response-templating
See the command line docs for the standalone equivalents of these parameters.
「Response Templating」のドキュメント内にdocker run
への渡し方はなかったので完全に見落としまして、「全然動かないぞ〜」とハマっていました
気づいたきっかけ
色々と見る中で https://wiremock.org/docs/standalone/docker/#building-your-own-image を通りかかり
「おっと、--global-response-templating
という引数渡してるぞ。
これ、なのか?
docker run
でも渡して... 動いたああああああ!!!」
そして、「Response Templating」のドキュメント中のコマンドラインオプションを見落としたことに気づきます
ハマった副産物:WireMockの拡張の指定の仕方
リポジトリの「Use wiremock extensions」より
https://github.com/wiremock/wiremock-docker/tree/3.1.0-1#use-wiremock-extensions
2つのやり方が案内されますが、1つはMavenから拡張をダウンロードしてきて、/var/wiremock/extensions
にマウントしてdocker run
です。
「response-templateを拡張として指定するの?」と迷走した時期がありました...
なお、response-templateはビルトインの以下だと思っています。
https://github.com/wiremock/wiremock/blob/3.1.0/src/main/java/com/github/tomakehurst/wiremock/extension/ResponseTransformer.java
(V2推奨みたいです)
終わりに
📣wiremock-dockerでResponse Templatingするときは--global-response-templating
の指定が必要です!
docker run --rm -it \ -p 8080:8080 \ --name chisataki-mock \ -v $PWD:/home/wiremock \ wiremock/wiremock:3.1.0-1 \ --global-response-templating
Response Templatingドキュメント内のThe request modelを参照すると、リクエスト中の色々なデータを参照できて捗りそうでした。
--global-response-templating
だけ、お忘れなく!!
- Dockerのほか、JARファイルから動かせるそうです。 WireMock as a Standalone Service↩