从 set-body 中的 if 语句访问 MatchedParameters

问题描述

在 REST API 的 APIM 策略中,我正在尝试为后端服务创建 SOAP 请求。 REST 请求的 URI 是 /GetCustomer/{accountNumber}。 在下面的 Liquid if 语句中,我试图检查 MatchedParameters 集合是否包含帐号。这不起作用,我从 else 分支获取值。 我尝试了几种变体:

  1. {% if {{context.Request.MatchedParameters.ContainsKey("accountNumber")}} %}
  2. {% if @(context.Request.MatchedParameters.ContainsKey("accountNumber")) %}
  3. {% if context.Request.MatchedParameters.ContainsKey("accountNumber") %}
<set-body template="liquid">
            <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://my-services.com/CustomerService/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <soap:Body>
                    <GetCustomer>
                        <request>
                            {% if {{context.Request.MatchedParameters.ContainsKey("accountNumber")}} %}
                            <AccountNumber>{{context.Request.MatchedParameters["accountNumber"]}}</AccountNumber>
                            {% else %}
                            <AccountNumber xsi:nil="true" />
                            {% endif %}
                        </request>
                    </GetCustomer>
                </soap:Body>
            </soap:Envelope>
        </set-body>

如果不使用 if 语句可以正常工作,那么请求就会按照我的预期构造:

<set-body template="liquid">
            <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://my-services.com/CustomerService/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <soap:Body>
                    <GetCustomer>
                        <request>                           
                            <AccountNumber>{{context.Request.MatchedParameters["accountNumber"]}}</AccountNumber>
                        </request>
                    </GetCustomer>
                </soap:Body>
            </soap:Envelope>
        </set-body>

所以问题是:是否可以从 Liquid if 语句中访问上下文?如果是这样,正确的语法是什么?

解决方法

我在我身边测试,你只需要像这样写液体:

{% if context.Request.MatchedParameters["accountNumber"] != null %}
    
{% else %}
    
{% endif %}

顺便说一句:根据我的测试,如果您在 APIM 的请求 url 中指定了 {accountNumber}。我们必须用 ...../GetCustomer/{accountNumber} 来请求它,如果我们用 ...../GetCustomer 来请求它,它会显示 404 错误。因此,您无需担心“如果 context.Request.MatchedParameters["accountNumber"] 存在