【问题标题】:How can I parse a querystring using liquid template in Azure API-Management set-body?如何使用 Azure API-Management set-body 中的液体模板解析查询字符串?
【发布时间】:2018-03-06 12:26:42
【问题描述】:

我希望有人看到这一点并确切知道该怎么做。我觉得我尝试了所有方法:(。为了提供一点背景知识,我正在尝试创建一个通用的 rest 端点来代理 SOAP 报告服务后端并将查询字符串 keyValues 作为参数传递。

我使用 context.Request.OriginalUrl.Query 开始了路径,即:IReadOnlyDictionary<string, string[]> 并遍历键和值。这是我的首选方法,但我收到了错误:

Liquid 语法错误:对象 '[p_customer_name, System.String[]]' 是 无效,因为它既不是内置类型也不是实现 可流动的

上面生成的代码:

<v2:listOfParamNameValues>
    {% for parameter in context.Request.OriginalUrl.Query %}
    <v2:item><v2:name>{{parameter.Key}}</v2:name><v2:values>
            {% for value in parameter.Value %}
            <v2:item>{{value}}</v2:item>
            {% endfor %}
        </v2:values></v2:item>
    {% endfor %}
</v2:listOfParamNameValues>

我放弃了,开始自己解析 QueryString 以便继续前进,但使用 Split: &amp;amp;Split: '&amp;amp;' 似乎忽略了 & 和 Split: '&amp;' 会导致错误:

一个或多个字段包含不正确的值:发生错误时 解析实体名称。第 15 行,位置 123。

<v2:listOfParamNameValues>{% assign parts = context.Request.OriginalUrl.QueryString | Remove-First: '?' | Split:'&amp;' -%}
    {%- for part in parts -%}
        {%- assign keyValues = part | Split:'=' -%}
        {%- for keyValue in keyValues -%}
            {{-keyValue[0]}}:{{keyValue[1]-}}
        {%- endfor -%}
     {%- endfor %}</v2:listOfParamNameValues>

我对任何想法持开放态度,如果还有什么我可以添加的可能有帮助的,请告诉我。

谢谢!

【问题讨论】:

  • context.Request.OriginalUrl.QueryString的内容是什么?
  • ?p1=test1&p2=test2
  • 对不起,我上周在度假。让我对此进行调查并为您解答。

标签: azure liquid azure-api-management dotliquid


【解决方案1】:

使用与号在带有液体模板的 set-body 内的 API 管理策略中进行拆分时似乎存在限制。

为了解决这个问题,我使用了额外的策略,如下所示:

<inbound>
    <base />
    <set-variable name="query_string_params" value="@(context.Request.OriginalUrl.QueryString.Substring(1).Replace("&","|"))" />
    <set-body template="liquid">
        {% assign parameters = context.Variables["query_string_params"] | Split: "|" %}
        <parameters>
        {% for p in parameters %}
            <parameter>
                {% assign parts = p | Split: "=" %}
                <name>{{parts.first}}</name>
                <value>{{parts.last}}</value>
            </parameter>
        {% endfor %}
        </parameters>
    </set-body>
</inbound>

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    液体过滤器区分大小写,似乎 dotliquid uses this convention by default

    {% assign parts = context.Request.OriginalUrl.QueryString | remove_first: '?' | split:'&' -%}
    

    【讨论】:

    • 我们将 dotliquid 配置为使用 Pascal 套管。那是个错误……叹息。
    • 不是液体过滤器出现故障,因此这种情况对于 API 管理策略是正确的。这是导致我的问题的'&'。我可以在 '=' 上拆分就好了。
    猜你喜欢
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    相关资源
    最近更新 更多