【问题标题】:Is there a way to include multiple json files in the response based on the query params?有没有办法根据查询参数在响应中包含多个 json 文件?
【发布时间】:2019-06-03 22:02:40
【问题描述】:

我正在尝试使用 Wiremock 独立进程来模拟来自服务器的答案。情况是,对于特定的端点(我们称之为/items),我可以提供多个查询参数(如/items?item=1&item=10&item=12)。 我想根据查询参数从单独的 json 文件“构建”响应 - 所以构建类似 jsonBody 的东西,其中包含来自item_1.jsonitem_10item_12 的单独 json 文件的内容

也许一个例子会告诉更多 - 这是映射文件:

{
"request": {
    "method": "GET",
    "urlPathPattern": "/items",
    "queryParameters": {
        "item": {
            "matches": "1"
        },
        "item": {
            "matches": "10"
        },
        "item": {
            "matches": "12"
        }
    }
},
"response": {
    "status": 200,
    "jsonBody": {
        "items": [
        {
            "bodyFileName": "items/item_{{request.query.item.first}}.json"
        },
        {
            "bodyFileName": "items/item_{{request.query.item.[-1]}}.json"
        },
        {
            "bodyFileName": "items/item_{{request.query.item.last}}.json"
        }]
    },
    "headers": {
        "Content-Type": "application/json"
    },
    "transformers": ["response-template"]
  }
}

所以基本上我很好奇是否有一种方法可以根据 Wiremock 中的查询参数来响应多个文件内容?

不幸的是,目前我只收到纯文本:

{
    "items": [
        {
            "bodyFileName": "items/item_1.json"
        },
        {
            "bodyFileName": "items/item_10.json"
        },
        {
            "bodyFileName": "items/item_12.json"
        }
    ]
}

【问题讨论】:

    标签: json response wiremock


    【解决方案1】:

    开箱即用的 WireMock 无法满足您的要求。

    最好的办法是编写一个ResponseDefinitionTransformer 实现,它采用您描述的正文 JSON 格式,加载引用的文件并将它们组合到响应正文中。

    在此处查看“转换响应”:http://wiremock.org/docs/extending-wiremock/

    【讨论】:

    • 谢谢,我们将深入了解转换响应
    【解决方案2】:

    当使用WireMock.Net 时,可以通过在此(示例)映射中将 UseTransformer 设置为 true

    {
        "Request": {
            "Path": {
                "Matchers": [
                    {
                        "Name": "WildcardMatcher",
                        "Pattern": "/bodyasfile_transform"
                    }
                ]
            },
            "Methods": [
                "get"
            ]
        },
        "Response": {
            "StatusCode": 200,
            "Headers": { "Content-Type": "application/xml" },
            "BodyAsFile": "c:\\temp-wiremock\\__admin\\mappings\\_{{request.query.MyUniqueNumber}}_\\MyXmlResponse.xml",
            "UseTransformer": true
        }
    }
    



    更新 使用最新版本,可以从文件中导入内容:

    {
        "Guid": "fd8ca21b-db82-48bc-ae5a-fc2153c2b000",
        "Request": {
            "Path": {
                "Matchers": [
                    {
                        "Name": "WildcardMatcher",
                        "Pattern": "/filefragment"
                    }
                ]
            },
            "Methods": [
                "get"
            ]
        },
        "Response": {
            "Headers": { "Content-Type": "application/json" },
            "BodyAsJson": {
                "file1": "{{File \"c:\\\\temp-wiremock\\\\__admin\\\\mappings\\\\test_1.txt\"}}",
                "file2": "{{File \"c:\\\\temp-wiremock\\\\__admin\\\\mappings\\\\test_{{request.query.MyUniqueNumber}}.txt\"}}"
            },
            "UseTransformer": true
        }
    }
    

    【讨论】:

    • 是否可以从例如构造一个响应体?三个不同的文件?或者我只能将一个文件的内容设置为 BodyAsFile?
    • @buccaneer。不,该功能未实现。 BodyAsFile 只能从 1 个文件生成。但是,您的问题听起来是个好主意。我会调查是否可以添加此功能。
    猜你喜欢
    • 2012-05-30
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多