nikkie-ftnextの日記

イベントレポートや読書メモを発信

wiremock-dockerでResponse Templatingを動かすには、docker runするときにイメージに--global-response-templatingを渡す必要がありました

はじめに

琴葉ちゃん、お誕生日おめでとう! nikkieです。

直近のめちゃハマり記です。
Response Templatingが全然動かない〜とハマってました。

目次

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"]
    }
}

リクエストの設定

レスポンスの設定

https://wiremock.org/docs/response-templating/#applying-templating-in-local-mode を参照しました

動作確認! あれ、テンプレートが機能しない?

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だけ、お忘れなく!!


  1. Dockerのほか、JARファイルから動かせるそうです。 WireMock as a Standalone Service