同时发布带有 bicep set-body 和 set-backend-service 的 apim 策略

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

我有以下二头肌模块:

// fails if set-backend-service and set-body are used together
// var apiOperationPolicy = format('''
// <policies>
//     <inbound>
//         <base />
//         <rewrite-uri template="/" />
//         <set-backend-service base-url="{0}" />
//         <set-body>
//             <value>@{
//                 var body = context.Request.Body.As<JObject>();
//                 body["source"] = body["operation"];
//                 return body.ToString();
//             }</value>
//         </set-body>
//     </inbound>
//     <backend>
//         <base />
//     </backend>
//     <outbound>
//         <base />
//     </outbound>
//     <on-error>
//         <base />
//     </on-error>
// </policies>
// ''', formattedBasePath)


//works if only set-body
// var apiOperationPolicy = '''
// <policies>
//     <inbound>
//         <base />
//         <rewrite-uri template="/" />
//         <set-body>
//             <value>@{
//                 var body = context.Request.Body.As<JObject>();
//                 body["source"] = body["operation"];
//                 return body.ToString();
//             }</value>
//         </set-body>
//     </inbound>
//     <backend>
//         <base />
//     </backend>
//     <outbound>
//         <base />
//     </outbound>
//     <on-error>
//         <base />
//     </on-error>
// </policies>
// '''


//works if only set-backend-service is used
var apiOperationPolicy = format('''
<policies>
    <inbound>
        <base />
        <rewrite-uri template="/" />
        <set-backend-service base-url="{0}" />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>
''', formattedBasePath)

resource apiOperationPolicyResource 'Microsoft.ApiManagement/service/apis/operations/policies@2022-04-01-preview' = {
  parent: apiOperation
  name: 'policy'
  properties: {
    value: apiOperationPolicy
    format: 'rawxml'
  }
}

如果我尝试设置这两个策略,则会收到以下错误:

错误:InvalidTemplate - 部署模板验证失败:“模板变量“apiOperationPolicy”无效:无法评估语言函数“格式”:格式无效:“输入字符串的格式不正确。”

有谁知道这是什么原因吗?

azure azure-api-management azure-bicep
1个回答
0
投票

错误:InvalidTemplate - 部署模板验证失败:“模板变量“apiOperationPolicy”无效:无法评估语言函数“格式”:格式无效:“输入字符串的格式不正确。”

我之前在我的环境中尝试时也收到了同样的错误。我使用以下解决方法来解决该问题并按预期工作。

基本上,您使用的占位符的目的是。部署后,它将被格式化的基本路径 URL 替换。因此,不要使用

{0}
作为占位符,而是尝试使用名为
_base_url_
的占位符来避免输入格式的冲突,因为当 bicep 读取 XML 的多行结构时,有可能出现解析错误。

通过

_base_url_
后,使用策略中可用的
replace()
函数将占位符替换为存储在格式化基本路径中的实际 URL。

param formattedBasePath string = 'https://google.com'
var apiOperationPolicy = '''
<policies>
    <inbound>
        <base />
        <rewrite-uri template="/" />
        <set-backend-service base-url="_base_url_" />
        <set-body>
            <value>@{
                var body = context.Request.Body.As<JObject>();
                body["source"] = body["operation"];
                return body.ToString();
            }</value>
        </set-body>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>
'''

使用replace()函数:

var replacepolicy = replace(apiOperationPolicy,  '_base_url_',  formattedBasePath)
resource apiManagementService 'Microsoft.ApiManagement/service@2023-05-01-preview' existing = {
  name: 'newapimjah'
}

resource api 'Microsoft.ApiManagement/service/apis@2020-12-01' existing = {
  parent: apiManagementService
  name:'apinewjah'
}

resource apiOperation 'Microsoft.ApiManagement/service/apis/operations@2023-09-01-preview' existing = {
  name: 'firstop'
  parent: api
}

resource apiOperationPolicyResource 'Microsoft.ApiManagement/service/apis/operations/policies@2022-04-01-preview' = {
  parent: apiOperation
  name: 'policy'
  properties: {
    value: replacepolicy
    format: 'rawxml'
  }
}

部署成功:

enter image description here

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.