You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"
  }
}
  • 步骤分解:
    1. regexExtract request.body 'TradeSha=([^&]+)' 1:提取TradeSha参数的URL编码值。
    2. urlDecode ...:将编码值解码为正常的URL字符串。
    3. regexExtract ... 'tId=([^&]+)' 1:从解码后的URL中直接提取tId的值,正则更简洁直观。
验证建议

修改配置后重新发送请求:

  • 检查WireMock返回的Location头,确认tId和token已替换为请求中的实际值。
  • 可通过response.body中打印的Raw Body确认请求Body是否正确传入,辅助排查匹配问题。

内容的提问来源于stack exchange,提问作者lionheart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 19:37:05