0

我遇到了关于在 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}}”,并且发现车牌号没有任何问题。所以我在想后端的某些东西肯定会被属性的名称弄糊涂。

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

提前致谢。

4

1 回答 1

1

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

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

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

<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>
于 2020-06-08T09:48:43.813 回答