差異處
這裏顯示兩個版本的差異處。
Both sides previous revision 前次修改 下次修改 | 前次修改 | ||
java:wiremock:record-events-from-webhook [2021/08/15 00:29] tony |
java:wiremock:record-events-from-webhook [2021/08/15 18:48] tony |
||
---|---|---|---|
行 1: | 行 1: | ||
{{tag>wiremock}} | {{tag>wiremock}} | ||
- | ====== WireMock - Record WebHook events ====== | + | ====== WireMock - Record Webhook Events ====== |
===== Problem ===== | ===== Problem ===== | ||
我有一隻待測程式(SUT)會相依於外部服務(External Service)的webhook 機制,操作流程如下: | 我有一隻待測程式(SUT)會相依於外部服務(External Service)的webhook 機制,操作流程如下: | ||
行 9: | 行 9: | ||
WireMock有提供[[http://wiremock.org/docs/webhooks-and-callbacks/|webhook]]的extension,讓你可以自行編寫程式或mappingfile腳本去做到在"特定操作後,發送webhook操作",但它並不支援Recording的功能。本篇文章,主要分享如何讓WireMock擁有錄製webhook的功能。\\ | WireMock有提供[[http://wiremock.org/docs/webhooks-and-callbacks/|webhook]]的extension,讓你可以自行編寫程式或mappingfile腳本去做到在"特定操作後,發送webhook操作",但它並不支援Recording的功能。本篇文章,主要分享如何讓WireMock擁有錄製webhook的功能。\\ | ||
\\ | \\ | ||
- | Note. 範例程式碼[[https://github.com/frank007love/wiremock-redfish|link]]可自行取用。這是依照我需求撰寫的,只要弄懂方法,就可以依照你需求自行調整。 | + | Note. 範例程式碼[[https://github.com/frank007love/wiremock-redfish|link]]可自行取用。這是依照我需求撰寫的,只要弄懂方法,就可以依照你需求自行調整。\\ |
+ | Limitation. 如果webhook的反註冊是基於回應內容的URL,目前還沒想到辦法可以根據SUT的IP與情境去做對應的內容回應。 | ||
===== How to? ===== | ===== How to? ===== | ||
==== Pre-notice ==== | ==== Pre-notice ==== | ||
行 103: | 行 104: | ||
} | } | ||
</code> | </code> | ||
- | 接著由於註冊的request body中,destination包含著SUT的IP,而SUT會隨著執行環境而改變,這將導致錄製出來的腳本無法萬用。因此我必須將腳本內RequestBody的Destination移除: (註冊的URL就不需要處理了,因為當下的執行前後文是由你的腳本所促成,URL絕對會相同) | + | 接著由於註冊的request body中,destination包含著SUT的IP,而SUT會隨著執行環境而改變,這將導致錄製出來的腳本無法萬用。因此我必須將腳本內RequestBody的Destination移除,如果要考慮情境比較複雜可以直接套Library去移除: (註冊的URL就不需要處理了,因為當下的執行前後文是由你的腳本所促成,URL絕對會相同) |
<code java> | <code java> | ||
private void removeDestination(RequestPattern requestPattern) { | private void removeDestination(RequestPattern requestPattern) { | ||
行 119: | 行 120: | ||
private void applyWebHookEvents(StubMapping stubMapping) { | private void applyWebHookEvents(StubMapping stubMapping) { | ||
String context = parseContext(stubMapping); | String context = parseContext(stubMapping); | ||
+ | if(context == null) return; | ||
List<Event> postEvents = EventRecorder.getInstance().getEvents(context); | List<Event> postEvents = EventRecorder.getInstance().getEvents(context); | ||
List<PostServeActionDefinition> postServerActionDefinitions = postEvents.stream() | List<PostServeActionDefinition> postServerActionDefinitions = postEvents.stream() |