Azure API 管理:通过路径和查询参数区分操作

Azure API Management: Discriminate operations by both path and query parameters

我有一个后端 API(实现 ApiController),我想将其放在 APIM API 后面。 ApiController 允许我们根据传入的查询参数区分两个不同的 GET 操作。当我尝试在 APIM 中定义这些端点时,我收到以下错误:

该消息表明端点仅由路径和操作定义。但这似乎与我发现的文档相矛盾 here 这表明有一种方法可以根据查询参数区分操作:

Required parameters across both path and query must have unique names. (In OpenAPI a parameter name only needs to be unique within a location, for example path, query, header. However, in API Management we allow operations to be discriminated by both path and query parameters (which OpenAPI doesn't support). That's why we require parameter names to be unique within the entire URL template.)

我有一个 ApiController,它定义了两个不同的 Get 操作,区别仅在于查询参数。我如何在我的 APIM API?

中表示它

问题来自具有相同OperationId 的多个操作对象。这是无效的招摇。在 Swagger 文件中与所选 API 的名称不匹配,因此更改 doc 标签的 title 属性以匹配目标 API 它起作用了..

这里有一个类似的 你可以参考。

我从 Azure 支持那里得到了答案,在这里分享信息:

APIM 个端点由您分配给操作的路径、方法和名称定义。要区分同一控制器的两个 GET 端点(仅查询参数不同),您需要将所需的查询参数硬编码到路径中。请看下面两张图片:

在后一张图片中,硬编码查询参数被 UI 归类为模板参数,但它仍然表现得像常规查询参数。以这种方式定义的查询参数:

  • 需要
  • 可以出现在请求的查询参数列表中的任何位置
  • 不区分大小写
  • 在开发门户中作为 "Request Parameter" 与所有其他路径参数和查询参数一起列出

编辑:

屏幕截图中有错字。 URL 区分大小写,"blah" 的大小写在每种情况下都不同。这是 Open API 规范在大小写一致时的样子。重载路径(查询参数硬编码到路径模板中)出现在名为 x-ms-paths:

的部分中
{
    "swagger": "2.0",
    "info": {
        "title": "Echo API",
        "version": "1.0"
    },
    "host": "<hostUrl>",
    "basePath": "/echo",
    "schemes": ["https"],
    "securityDefinitions": {
        "apiKeyHeader": {
            "type": "apiKey",
            "name": "Ocp-Apim-Subscription-Key",
            "in": "header"
        },
        "apiKeyQuery": {
            "type": "apiKey",
            "name": "subscription-key",
            "in": "query"
        }
    },
    "security": [{
        "apiKeyHeader": []
    }, {
        "apiKeyQuery": []
    }],
    "paths": {
        "/Blah": {
            "get": {
                "operationId": "blah",
                "summary": "Blah",
                "responses": {}
            }
        }
    },
    "tags": [],
    "x-ms-paths": {
        "/Blah?alpha={alpha}": {
            "get": {
                "operationId": "blah2",
                "summary": "Blah2",
                "parameters": [{
                    "name": "alpha",
                    "in": "query",
                    "required": true,
                    "type": "string"
                }],
                "responses": {}
            }
        }
    }
}