【问题标题】:Liquid mapping problem in API-Management PolicyAPI-Management Policy 中的 Liquid 映射问题
【发布时间】:2020-06-05 13:48:11
【问题描述】:

我遇到了关于在 API 管理策略中使用液体为“Soap to Rest”api 端点映射值的问题。

我的示例看起来像这样......

Soap 请求应返回如下内容:

<Response>
    <Truck>
        <ID>098NJ2139UND324<ID>
        <LicenceNumber>MKL025</LicenceNumber>
        <Cargo>
            <CargoLicenceNumber>BHJ897</CargoLicenceNumber>
            <Cargo>Candy</Cargo>
        </Cargo>
        <Cargo>
            <CargoLicenceNumber>TGA916</CargoLicenceNumber>
            <Cargo>Fireworks</Cargo>
        </Cargo>    
    </Truck>
</Response>

API 管理中“out”策略中的我的 Liquid 代码示例如下所示:

{
    "Response": {
        "id": "{{body.envelope.body.Response.ID}}",
        "licencenumber": "{{body.envelope.body.Response.LicenceNumber}}",
        "cargo": [
        {% JSONArrayFor item in body.envelope.body.Response where Cargo -%}
        {
            "cargolicencenumber": "{{item.CargoLicenceNumber}}",
            "cargo": "{{item.Cargo}}"
        }
        {% endJSONArrayFor -%}
        ]
    }
}

但是转换成 Json 的 XML 看起来像这样:

{
    "Response":{
        "ID": "098NJ2139UND324",
        "LicenceNumber": "MKL025",
        "Cargo": [{
                "CargoLicenceNumber": "BHJ897",
                "Cargo":""
            },
            {
                "CargoLicenceNumber": "TGA916",
                "Cargo":""
            }
        ]
    }
}

我在数组中缺少这个“货物”值。我知道设置有点笨拙,因为我认为数组对象“货物”的名称应该是“拖车”或类似的名称(注意:这是一个示例,而不是我正在使用的真实对象)。与数组子元素同名的数组是我认为导致问题的原因。

由于我不是 SOAP WSDL 的所有者,我曾经将其导入 API 管理以转换为其他 API,因此我无法轻松更改服务中数组的名称。我想知道是否有办法强制液体在数组中找到元素的值?

另外,值得一提的是:在对代码进行故障排除时,我将“{{item.Cargo}}”部分更改为“{{item.CargoLicenceNumber}}”,并且发现车牌号没有任何问题。所以我在想后端的某些东西肯定会被属性的名称弄糊涂。

以前有没有人遇到过这个问题?

提前致谢。

【问题讨论】:

    标签: arrays liquid azure-api-management api-management xml-to-json


    【解决方案1】:

    好像后端不能很好的处理xml属性。

    根据我的测试,如果我们使用 xml-to-json 策略,然后使用 Liquid 模板来处理它,后端将能够为您获取子元素“Cargo”。

    这是我的示例政策供您参考:

    <outbound>
        <base />
        <xml-to-json kind="direct" apply="always" consider-accept-header="false" />
        <set-body template="liquid">
        {
            "Response": {
                "id": "{{body.Response.Truck.ID}}",
                "licencenumber": "{{body.Response.Truck.LicenceNumber}}",
                "cargo": [
                {% JSONArrayFor item in body.Response.Truck.Cargo %}
                    {
                        "cargolicencenumber": "{{item.CargoLicenceNumber}}",
                        "cargo": "{{item.Cargo}}"
                    }
                {% endJSONArrayFor %}
                ]
            }
        }
        </set-body>
    </outbound>
    

    【讨论】:

    • 感谢您回答@AllenWu,这对我来说不起作用,在“set-body”之前实现“Xml-to-Json”元素后,值无法访问。
    • @John 它对我来说很好用。您的 Soap 响应有错误。 &lt;ID&gt;098NJ2139UND324&lt;ID&gt; 应修改为 &lt;ID&gt;098NJ2139UND324&lt;/ID&gt;。如果还是不行,请分享你真实的 Soap 响应和你现在使用的 APIM 政策。
    • 您好@Allen 很抱歉回答迟了,我所做的只是直接使用“xml-to-json”转换,然后将我的策略中的“set-body”部分设置为正文由上下文的转换方法返回。并返回了我需要的正确 json 字符串。出于某种原因,在我的“set-body”标签中使用“template=liqud”不会让我终生了解如何输入上下文去获取值,而是将整个根属性返回为空。我正在使用 Soap 来休息,所以我认为后面有很多事情会在参考方面造成混乱。
    • 另外,恐怕我无法显示我正在使用的数据,因为它与我正在工作的公司的集成相关。
    • @John 没问题。事实上,我唯一修改的是:{% JSONArrayFor item in body.envelope.body.Response where Cargo -%}{% JSONArrayFor item in body.Response.Truck.Cargo %}。请检查一下。
    猜你喜欢
    • 2016-02-17
    • 2021-03-22
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 2010-10-11
    • 2021-01-15
    相关资源
    最近更新 更多