我希望有人看到这一点,并确切知道该怎么做。我觉得我尝试了一切:(。为了给一些背景知识,我正在尝试创建一个通用的休息端点来代理SOAP报告服务后端,并将查询字符串keyValues作为参数传递。
我使用context.Request.OriginalUrl.Query开始了这条路径,它是:IReadOnlyDictionary<string, string[]>
并遍历键和值。这是我的首选方法,但我收到了错误:
液体语法错误:对象'[p_customer_name,System.String []]'是 无效,因为它既不是内置类型也不是实现 ILiquidizable
上面生成的代码:
<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: &
或Split: '&'
似乎忽略了&amp;并Split: '&'
导致错误:
一个或多个字段包含不正确的值:发生错误 解析EntityName。第15行,第123位。
<v2:listOfParamNameValues>{% assign parts = context.Request.OriginalUrl.QueryString | Remove-First: '?' | Split:'&' -%}
{%- for part in parts -%}
{%- assign keyValues = part | Split:'=' -%}
{%- for keyValue in keyValues -%}
{{-keyValue[0]}}:{{keyValue[1]-}}
{%- endfor -%}
{%- endfor %}</v2:listOfParamNameValues>
我对任何想法持开放态度,请告诉我是否还有其他任何可能有用的建议。
谢谢!
答案 0 :(得分:2)
使用Ampersand在带有液体模板的set-body内的API Management策略中进行拆分时似乎存在限制。
为了解决这个问题,我使用了另外一个策略,如下所示:
<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>
希望这有帮助!
答案 1 :(得分:0)
液体过滤器区分大小写,似乎是dotliquid uses this convention by default。
{% assign parts = context.Request.OriginalUrl.QueryString | remove_first: '?' | split:'&' -%}