API管理策略中的液体映射问题

问题描述 投票:0回答:1

我遇到了一个问题,关于在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>

我的Liquid代码样本在API管理中的 "out "策略中看起来是这样的。

{
    "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":""
            }
        ]
    }
}

我在数组中缺少了 "Cargo "这个值。我知道设置有点笨拙,因为我认为数组对象 "Cargo "的名称应该是 "Trailer "或类似的东西(注意:这是一个例子,不是我正在使用的真实对象)。数组与数组子元素同名是我认为造成问题的原因。

由于我不是SOAP WSDL的所有者,我用来导入API管理,然后再转换为休息API,我不能轻易地改变服务中Array的名称。我想知道是否有一种方法可以强制液体找到数组中元素的值?

另外,值得一提的是:我在解决代码问题时,把"{{item.Cargo}}"部分改成了"{{item.CargoLicenceNumber}}",这样就能顺利找到车牌号了。所以我想肯定是后端有什么东西被属性名称搞混了。

之前还有人遇到过这个问题吗?

先谢谢你了。

arrays liquid azure-api-management api-management xml-to-json
1个回答
1
投票

似乎后端不能很好地处理xml属性。

根据我的测试,如果我们使用xml-to-json策略,然后使用液体模板来处理它,后端将能够为你获取子元素 "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>
© www.soinside.com 2019 - 2024. All rights reserved.