代码之家  ›  专栏  ›  技术社区  ›  Mike Florian Doyen

如何在Azure API管理集正文中使用液体模板解析查询字符串?

  •  2
  • Mike Florian Doyen  · 技术社区  · 7 年前

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

    我开始使用上下文。要求原版,原版。查询是: IReadOnlyDictionary<string, string[]> 并循环遍历键和值。这是我首选的方法,但我收到了错误:

    液体语法错误:对象“[p\u customer\u 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>
    

    我放弃了这一点,开始自己解析查询字符串,以便继续,但使用 Split: &amp; Split: '&amp;' 似乎忽略了&和 Split: '&' 导致错误:

    一个或多个字段包含不正确的值:在 正在分析EntityName。第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>
    

    我对任何想法都持开放态度,如果还有什么其他我可以补充的,请告诉我。

    非常感谢。

    2 回复  |  直到 7 年前
        1
  •  2
  •   roberto-mardeni    7 年前

    当使用符号在具有液体模板的集合主体内的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
  •  0
  •   David Jacquel    7 年前

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

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