首页 > 解决方案 > Azure API 管理:通过路径和查询参数区分操作

问题描述

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

在此处输入图像描述

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

路径和查询中的必需参数必须具有唯一名称。(在 OpenAPI 中,参数名称只需要在一个位置内是唯一的,例如路径、查询、标头。但是,在 API 管理中,我们允许通过路径和查询参数来区分操作(OpenAPI 不支持)。那是为什么我们要求参数名称在整个 URL 模板中是唯一的。)

我有一个 ApiController 定义了两个不同的 Get 操作,只是查询参数不同。我如何在我的 APIM API 中表示它?

标签: azureazure-api-managementasp.net-apicontroller

解决方案


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

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

获取端点 1

获取端点 2

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

  • 是必须的
  • 可以出现在请求的查询参数列表中的任何位置
  • 不区分大小写
  • 在开发门户中与所有其他路径参数和查询参数一起列为“请求参数”

编辑:

截图中有错别字。URL 区分大小写,并且“blah”的大小写在每种情况下都不同。以下是大小写一致时开放 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": {}
            }
        }
    }
}

推荐阅读