我遇到了一个问题,关于在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}}",这样就能顺利找到车牌号了。所以我想肯定是后端有什么东西被属性名称搞混了。
之前还有人遇到过这个问题吗?
先谢谢你了。
似乎后端不能很好地处理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>