如何在WireMock响应模板中获取表单请求字段的最后n位字符?
解决WireMock响应中提取请求卡号最后四位的问题
针对你的需求,在WireMock 2.35.0版本中,可以通过response-template转换器结合字符串截取函数实现提取请求体card[number]的最后四位并赋值给响应的last4字段,具体修改如下:
关键修改点
把响应体中固定的"last4": "4242"替换为模板表达式,步骤如下:
- 用
formData解析URL编码的请求体为表单对象 - 用
lookup获取card[number]的值 - 用
substring(-4)截取该字符串的最后四位(负数索引表示从末尾开始计数)
另外注意你原来的响应体JSON存在语法错误:{\"last4\": \"4242\",多了一个左大括号,需要删除,否则会导致JSON解析失败。
修正后的完整Stub
{ "id":"86c2bb75-6de5-48aa-9c14-3cfc2483d12b", "name":"v1_payment_methods", "request":{ "url":"/stripe/v1/payment_methods", "method":"POST", "bodyPatterns":[ { "equalTo":"type=card&card[cvc]=890&card[number]=4242424242424242&card[exp_month]=1&card[exp_year]=2043", "caseInsensitive":false } ] }, "response":{ "status":200, "body":"{\n \"id\": \"pm_{{randomValue length=24 type='ALPHANUMERIC'}}\",\n \"object\": \"payment_method\",\n \"billing_details\": {\n \"address\": {\n \"city\": null,\n \"country\": null,\n \"line1\": null,\n \"line2\": null,\n \"postal_code\": null,\n \"state\": null\n },\n \"email\": null,\n \"name\": null,\n \"phone\": null\n },\n \"card\": {\n \"brand\": \"visa\",\n \"checks\": {\n \"address_line1_check\": null,\n \"address_postal_code_check\": null,\n \"cvc_check\": \"unchecked\"\n },\n \"country\": \"US\",\n \"exp_month\": {{formData request.body 'form' urlDecode=true}}{{lookup form 'card[exp_month]'}},\n \"exp_year\": {{formData request.body 'form' urlDecode=true}}{{lookup form 'card[exp_year]'}},\n \"fingerprint\": \"{{randomValue length=16 type='ALPHANUMERIC'}}\",\n \"funding\": \"credit\",\n \"generated_from\": null,\n \"last4\": \"{{formData request.body 'form' urlDecode=true}}{{lookup form 'card[number]' | substring -4}}\",\n \"networks\": {\n \"available\": [\n \"visa\"\n ],\n \"preferred\": null\n },\n \"three_d_secure_usage\": {\n \"supported\": true\n },\n \"wallet\": null\n },\n \"created\": {{now format='unix'}},\n \"customer\": null,\n \"livemode\": false,\n \"metadata\": {},\n \"type\": \"{{formData request.body 'form' urlDecode=true}}{{lookup form 'type'}}\"\n}", "transformers":[ "response-template" ] }, "uuid":"86c2bb75-6de5-48aa-9c14-3cfc2483d12b", "persistent":true, "insertionIndex":7 }
说明
{{formData request.body 'form' urlDecode=true}}:解析URL编码的请求体为名为form的上下文对象{{lookup form 'card[number]'}}:从form对象中取出card[number]的值| substring -4:通过管道符调用substring函数,截取字符串的最后四位(WireMock模板函数支持这种管道式调用)
内容的提问来源于stack exchange,提问作者tuk
相关产品推荐
相关产品推荐

