Wiremock 中如何处理动态数量的路径参数?

问题描述 投票:0回答:1

我是 Wiremock 新手,在处理可能具有一个或多个路径参数的 URL 时遇到问题。

例如,我有这个网址:

/产品/{产品名称};重量={重量};尺寸={尺寸};isdigital={isdigital};数字格式={数字格式};详细信息={详细信息}

产品名称为必填项,其余为选填。如果 isdigital 为 true,则不会有重量和尺寸等值。可选值也不必按此顺序。

我创建了以下内容,但它显然不起作用。也许 urlPathTemplate 使用错误。

{
  "request" : {
    "method" : "GET",
    "urlPathTemplate" : "/product/{productname};weight={weight};size={size};isdigital={isdigital};digitalformat={digitalformat};details={details}",
    "pathParameters" : {
      "productname" : {
        "equalTo" : "First Blood"
      },
      "isdigital" : {
        "equalTo" : "yes"
      },
      "digitalformat" : {
        "equalTo": "dvd"
      }
    }
  },
  "response" : {
    "status" : 200,
    "headers": {
      "Content-Type" : "application/json"
    },
    "bodyFileName": "product-first-blood-digital-dvd.json"
  }
}

更糟糕的是,{details} 是一个编码的 JSON 字符串,其中包含描述、流派等,并且这些值也是可选的。以下是一些将使用的示例 URL,上面的 URL 不适用于其中任何一个:

/产品/第一滴血;isdigital=true;格式=dvd

/产品/第一滴血;格式=DVD;isdigital=true

/产品/第一滴血;详细信息=%7B%22description%22%3A%22A%20movie%22%2C%22genre%22%3A%22Action%22%7D;format=dvd;isdigital=true

/产品/第一滴血;isdigital=false;尺寸=2;重量=1

我不知道为什么要这样创建 URL,不幸的是我无法用查询参数替换路径参数。有没有办法为这样的 URL 创建映射文件?

wiremock path-parameter
1个回答
0
投票

据我所知,我们目前对此还没有很好的答案。 查看 URI 模板 RFC 看起来您应该能够制作如下所示的 WireMock url 模板:

/product/{productname}{;isdigital,format,details,weight,size}

WireMock 将允许在

urlPathTemplate
字段中执行此操作,但它不会给您带来太多帮助,因为 WireMock 看起来不支持任何具有该 URL 模板样式的匹配器(例如
pathParameters
)。 这是我们应该解决的问题,我会提票来看看。

目前我唯一可以建议的是在你的身体中使用正则表达式来提取你正在寻找的值,但我不知道这是否能让你通过嘲笑实现你想要的东西,这可能意味着你的回应模板会有点长。

例如,以下存根将匹配您的网址,正则表达式给出了如何提取这些值的示例:

{
  "request": {
    "method": "GET",
    "urlPathTemplate": "/product/{productname}"
  },
  "response": {
    "status": 200,
    "headers": {
      "Content-Type": "application/json"
    },
    "transformers": [
      "response-template"
    ],
    "jsonBody": {
      "product": "{{regexExtract request.url '/product/([a-z\\-]+);' 'product' default=''}}{{product}}",
      "isdigital": "{{regexExtract request.url 'isdigital=(true|false)' 'isdigital' default=''}}{{isdigital}}",
      "format": "{{regexExtract request.url 'format=([^\\;]+)' 'format' default=''}}{{format}}",
      "details": "{{regexExtract request.url 'details=([^\\;]+)' 'details' default=''}}{{details}}",
      "weight": "{{regexExtract request.url 'weight=([^\\;]+)' 'weight' default=''}}{{weight}}",
      "size": "{{regexExtract request.url 'size=([^\\;]+)' 'size' default=''}}{{size}}"
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.