我正在添加 API 策略,我已启用许多 API,并且想要添加 API 特定策略。我根据配置文件中发送的 API 所有者请求添加速率限制,有些 API 提供速率限制,有些则不提供。同时 API 也使用不同的身份验证(JWT 或 subscription_id)。我想在策略中添加条件,即如果 API 所有者给出了速率限制,并且 API 通过 jwt/subscription_id 进行了验证,则添加给定的速率限制,如果没有,则不执行任何操作。我尝试了下面的代码
<policies>
<inbound>
<set-variable name="isjwt" value="@(context.Request.Headers.GetValueOrDefault('Authorization', '').AsJwt()?.Subject)" />
<set-variable name="isSubId" value="@(context.Subscription.Id)" />
<choose>
<when condition="(${var.api.rate_limit} != "" and (context.Variables["isjwt"] != null or context.Variables["isSubId"] != null))">
<rate-limit-by-key calls=${var.api.rate_limit} renewal-period="60" counter-key="@(context.Variables["isjwt"] ?? context.Variables["isSubId"])" />
</when>
</choose>
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
variable "api" {
type = object({
name = string
rate_limit = string
})
}
地形计划看起来像这样
+ <set-variable name="isAuthenticated" value="@(context.Request.Headers.GetValueOrDefault('Authorization', '').AsJwt()?.Subject)" />
+ <set-variable name="hasSubscriptionId" value="@(context.Subscription.Id)" />
+
+ <choose>
+ <when condition="( != "" and (context.Variables["isjwt"] != null or context.Variables["isSubId"] != null))">
+ <rate-limit-by-key calls="" renewal-period="60" counter-key="@(context.Variables["isjwt"] ?? context.Variables["isSubId"])" />
+ </when>
+ </choose>
我在条件下遇到错误
var.api.rate_limit != ""
我尝试添加单引号它没有帮助,
错误:创建/更新 Api 策略:(策略名称“xml”/Api 名称“APINAME”/服务名称“SERVICENAME”/资源组“RGNAME”):apimanagement.APIPolicyClient#CreateOrUpdate:响应请求失败:StatusCode=400 - - 原始错误:autorest/azure:服务返回错误。 Status=400 Code="ValidationError" Message="一个或多个字段包含不正确的值:" 详细信息=[{"code":"ValidationError","message":"名称不能以 '"' 字符开头,十六进制值 0x22 。第 36 行,位置 52.","target":"representation"}]
Azure API 管理策略:无法添加条件来检查字符串是否为空:-
使用以下修改后的政策来解决您的报价冲突(
"
)。
resource "azurerm_api_management_api_operation_policy" "example" {
api_name = azurerm_api_management_api_operation.example.api_name
api_management_name = azurerm_api_management_api_operation.example.api_management_name
resource_group_name = azurerm_api_management_api_operation.example.resource_group_name
operation_id = azurerm_api_management_api_operation.example.operation_id
xml_content = <<XML
<policies>
<inbound>
<set-variable name="isjwt" value="@(context.Request.Headers.GetValueOrDefault('Authorization', '').AsJwt()?.Subject)" />
<set-variable name="isSubId" value="@(context.Subscription.Id)" />
<choose>
<when condition='(${var.api.rate_limit} != "" and (context.Variables["isjwt"] != null or context.Variables["isSubId"] != null))'>
<rate-limit-by-key calls="${var.api.rate_limit}" renewal-period="60" counter-key="@(context.Variables["isjwt"] ?? context.Variables["isSubId"])" />
</when>
</choose>
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
XML
}
azurerm_api_management_api_operation_policy
模板,我尝试通过添加上述策略来部署您的需求,并且成功运行,如下所示。