x-www-form-urlencoded请求的WireMock重定向URL无法正常生效
问题分析
当前WireMock配置无法从请求Body中提取tId和token,返回默认值unknown-token,核心原因是:
请求Body的结构为TradeSha=<URL编码的完整跳转地址>,而tId和token嵌套在TradeSha参数的值内部,并非直接位于请求Body顶层。原正则表达式直接在整个Body中匹配tId%3D和token%3D,自然无法命中目标内容。
解决方案
以下两种方案均可解决问题,按需选择:
方案1:直接用嵌套正则提取
修改Location头的模板,先定位到TradeSha的值范围,再从中提取tId和token:
{ "request": { "urlPattern": "/mpggateway", "method": "POST", "headers": { "Content-Type": { "matches": "application/x-www-form-urlencoded.*" } } }, "response": { "status": 302, "headers": { "Location": "https://env.example.com/payments/RedirectHandler/1002?tId={{regexExtract request.body 'TradeSha=.*?tId%3D([^%26]+)' 1 default='unknown-token'}}&token={{regexExtract request.body 'TradeSha=.*?token%3D([a-f0-9\\-]+)' 1 default='unknown-token'}}" }, "body": "Raw Body: {{request.body}}", "delayDistribution": { "type": "uniform", "lower": 500, "upper": 750 } }, "metadata": { "description": "cool" } }
- 正则
TradeSha=.*?tId%3D([^%26]+):先匹配TradeSha=后的内容(非贪婪模式避免过度匹配),再捕获tId%3D后到%26(编码后的&)之前的所有字符,即为tId的值。 - 正则
TradeSha=.*?token%3D([a-f0-9\-]+):同理捕获token的值,适配其包含小写字母、数字和连字符的格式。
方案2:先解码再提取(可读性更高)
利用WireMock的urlDecode工具先解码TradeSha的值,再用更直观的正则提取tId和token:
{ "request": { "urlPattern": "/mpggateway", "method": "POST", "headers": { "Content-Type": { "matches": "application/x-www-form-urlencoded.*" } } }, "response": { "status": 302, "headers": { "Location": "https://env.example.com/payments/RedirectHandler/1002?tId={{regexExtract (urlDecode (regexExtract request.body 'TradeSha=([^&]+)' 1)) 'tId=([^&]+)' 1 default='unknown-token'}}&token={{regexExtract (urlDecode (regexExtract request.body 'TradeSha=([^&]+)' 1)) 'token=([a-f0-9\\-]+)' 1 default='unknown-token'}}" }, "body": "Raw Body: {{request.body}}", "delayDistribution": { "type": "uniform", "lower": 500, "upper": 750 } }, "metadata": { "description": "cool" } }
- 步骤分解:
regexExtract request.body 'TradeSha=([^&]+)' 1:提取TradeSha参数的URL编码值。urlDecode ...:将编码值解码为正常的URL字符串。regexExtract ... 'tId=([^&]+)' 1:从解码后的URL中直接提取tId的值,正则更简洁直观。
验证建议
修改配置后重新发送请求:
- 检查WireMock返回的
Location头,确认tId和token已替换为请求中的实际值。 - 可通过
response.body中打印的Raw Body确认请求Body是否正确传入,辅助排查匹配问题。
内容的提问来源于stack exchange,提问作者lionheart
相关产品推荐
相关产品推荐

