HTTPのモックサーバを立てる際に使用する stubby4j の利用サンプルです。
本記事は「はじめてのstubby4j」の続きです
以下に示す各種サンプルは、サンプルの構成に定義された状況で実行しています
YAMLファイルにレスポンスのJSONを直接記述
YAMLファイルに記述したレスポンスBodyの内容が応答されます
- YAMLでの定義例
# YAMLファイルにレスポンスのJSONを直接書く例 - request: method: [GET] url: /SampleServer/json1 response: status: 200 headers: content-type: application/json; charset=UTF-8 body: > { "id": 1001, "name": "Yamada Tarako", "age": 25, "remarks": "test user." }
- リクエスト
http://localhost:8882/SampleServer/json1
- レスポンス
{ "id": 1001, "name": "Yamada Tarako", "age": 25, "remarks": "test user." }
応答を遅延させる
リクエストを受けてからレスポンスを返すまでを遅延させることができます。
遅延時間を「latency」の項目で指定します
- YAMLでの定義例
# レスポンスを(10秒)遅らせる - request: method: [GET] url: /SampleServer/slowresponse response: latency: 10000 # 単位=ミリ秒 body: Hello, Slow Response!
- リクエスト
http://localhost:8882/SampleServer/slowresponse
- レスポンス
10秒後に以下のレスポンスが返ります
Hello, Slow Response!
リクエストのURLの一部やqueryパラメータをレスポンスに含める
リクエストのURLの一部やqueryパラメータを正規表現で受け取ることができます。
受け取った値をレスポンスに含めることができます。
- YAMLでの定義例
# リクエストのURLの一部やqueryパラメータをレスポンスに含める # accountのidとcatecoryの名前をURLから取得し、queryパラメータから日付を取得 - request: method: [GET] url: ^/account/(\d{5})/category/([a-zA-Z]+) query: date: "([a-zA-Z0-9]+)" response: status: 200 headers: content-type: application/json; charset=UTF-8 body: > { account_id: <% url.1 %>, category: "<% url.2 %>", date: "<% query.date.1 %>" }
- リクエスト
http://localhost:8882/account/12345/category/books?date=20160201
- レスポンス
レスポンス内容はリクエストに応じて動的に変化します
{ account_id: 12345, category: "books", date: "20160201" }
URLに応じてレスポンスの内容を変更する
リクエストのURLに応じてレスポンス用のファイルを切り替えることができます。
以下例では、URLにより応答するHTMLファイル名を決定しています。
- YAMLでの定義例
# URLに応じてレスポンスのhtmlファイルを切り替える - request: method: [GET] url: ^/SampleServer/([a-z]+).html response: status: 200 file: ../html/<% url.1 %>.html
- リクエスト/レスポンス(1)
http://localhost:8882/SampleServer/hello.html
→
Hello, World!
- リクエスト/レスポンス (2)
http://localhost:8882/SampleServer/goodbye.html
→
Bye, World!
queryパラメータに応じてレスポンスの内容を変更する
リクエストのqueryパラメータに応じてにレスポンス用のファイルを切り替えることができます。
以下例では、2つのqueryパラメータにより応答するJSONファイル名を決定しています。
- YAMLでの定義例
# queryパラメータに応じてレスポンスのjsonファイルを切り替える - request: method: [GET] url: ^/SampleServer/json/dynamic query: param1: "([a-zA-Z0-9]+)" param2: "([a-zA-Z0-9]+)" response: headers: content-type: application/json; charset=UTF-8 status: 200 file: ../json/<% query.param1.1 %>-<% query.param2.1 %>.json
- リクエスト/レスポンス(1)
http://localhost:8882/SampleServer/json/dynamic?param1=person¶m2=1
→
{ id: 100, name: "Yamada Taro" }
- リクエスト/レスポンス (2)
http://localhost:8882/SampleServer/json/dynamic?param1=book¶m2=1
→
{ id: 105, title: "Java vs Godzilla", description: "Love Story" }
- リクエスト/レスポンス (3)
http://localhost:8882/SampleServer/json/dynamic?param1=book¶m2=2
→
{ id: 109876, title: "Stubby4j in USJ", description: "Technical book" }
サンプルの構成
上記の各種サンプルは以下の構成で実行しました
ディレクトリ構成
/ │ ├─html │ hello.html │ goodbye.html │ ├─json │ person-1.json │ person-2.json │ book-1.json │ book-2.json │ └─server Sample.yml stubby4j-3.3.0.jar
YAMLファイルの中身
Sample.ymlに定義した内容
# YAMLファイルにレスポンスのJSONを直接書く例 - request: method: [GET] url: /SampleServer/json1 response: status: 200 headers: content-type: application/json; charset=UTF-8 body: > { "id": 1001, "name": "Yamada Tarako", "age": 25, "remarks": "test user." } # レスポンスを(10秒)遅らせる - request: method: [GET] url: /SampleServer/slowresponse response: latency: 10000 # 単位=ミリ秒 body: Hello, Slow Response! # リクエストのURLの一部やqueryパラメータをレスポンスに含める - request: method: [GET] url: ^/account/(\d{5})/category/([a-zA-Z]+) query: date: "([a-zA-Z0-9]+)" response: status: 200 headers: content-type: application/json; charset=UTF-8 body: > { account_id: <% url.1 %>, category: "<% url.2 %>", date: "<% query.date.1 %>" } # URLに応じてレスポンスのhtmlファイルを切り替える - request: method: [GET] url: ^/SampleServer/([a-z]+).html response: status: 200 file: ../html/<% url.1 %>.html # queryパラメータに応じてレスポンスのjsonファイルを切り替える - request: method: [GET] url: ^/SampleServer/json/dynamic query: param1: "([a-zA-Z0-9]+)" param2: "([a-zA-Z0-9]+)" response: headers: content-type: application/json; charset=UTF-8 status: 200 file: ../json/<% query.param1.1 %>-<% query.param2.1 %>.json
レスポンスファイルの中身
- hello.html
<html> <head> <title>Title - Hello</title> </head> <body>Hello, World!</body> </html>
- goodbye.html
<html> <head> <title>Title - Bye</title> </head> <body>Bye, World!</body> </html>
- person-1.json
{ id: 100, name: "Yamada Taro" }
- person-2.json
{ id: 235, name: "Sato Hanako" }
- book-1.json
{ id: 105, title: "Java vs Godzilla", description: "Love Story" }
- book-2.json
{ id: 109876, title: "Stubby4j in USJ", description: "Technical book" }