Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays API管理策略中的液体映射问题_Arrays_Liquid_Azure Api Management_Api Management_Xml To Json - Fatal编程技术网

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

Arrays API管理策略中的液体映射问题,arrays,liquid,azure-api-management,api-management,xml-to-json,Arrays,Liquid,Azure Api Management,Api Management,Xml To Json,在api管理策略中,我遇到了一个关于使用liquid为“Soap到Rest”api端点映射值的问题 我的例子看起来像这样 Soap请求应返回如下内容: <Response> <Truck> <ID>098NJ2139UND324<ID> <LicenceNumber>MKL025</LicenceNumber> <Cargo> <

在api管理策略中,我遇到了一个关于使用liquid为“Soap到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>
{
    "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 -%}
        ]
    }
}
{
    "Response":{
        "ID": "098NJ2139UND324",
        "LicenceNumber": "MKL025",
        "Cargo": [{
                "CargoLicenceNumber": "BHJ897",
                "Cargo":""
            },
            {
                "CargoLicenceNumber": "TGA916",
                "Cargo":""
            }
        ]
    }
}
但将XML转换为Json的过程如下所示:

<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>
{
    "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 -%}
        ]
    }
}
{
    "Response":{
        "ID": "098NJ2139UND324",
        "LicenceNumber": "MKL025",
        "Cargo": [{
                "CargoLicenceNumber": "BHJ897",
                "Cargo":""
            },
            {
                "CargoLicenceNumber": "TGA916",
                "Cargo":""
            }
        ]
    }
}
我在数组中缺少这个“货物”值。我知道设置有点笨拙,因为我认为数组对象“Cargo”的名称应该是“trail”或类似的名称(注意:这是一个示例,不是我正在使用的真实对象)。我认为与数组子元素同名的数组是导致问题的原因

由于我不是soapwsdl的所有者,所以我无法轻松地更改服务中数组的名称。soapwsdl用于导入到API管理以转换为restapi。我想知道是否有办法强迫液体找到数组中元素的值,如何

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

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


提前感谢。

看来后端无法很好地处理xml属性

根据我的测试,如果我们使用xml-to-json策略,然后使用liquid-template来处理它,后端将能够为您获取子元素“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>

{
“答复”:{
“id”:“{body.Response.Truck.id}”,
“LicenseNumber”:“{{body.Response.Truck.licenseNumber}”,
“货物”:[
{%jsonarrayforbody.Response.Truck.Cargo%中的项目]
{
“CargoLicenseNumber”:“{item.cargoLicenseNumber}”,
“货物”:“{item.cargo}”
}
{%endJSONArrayFor%}
]
}
}

感谢您回答@AllenWu,这在我这方面不起作用。在“set body”之前实现“Xml to Json”元素后,值是不可访问的。@John这对我来说很好。您的Soap响应有一个错误<代码>098NJ2139UND324应修改为
098NJ2139UND324
。如果仍然不起作用,请分享您真正的Soap响应和您现在使用的APIM策略。Hello@Allen很抱歉回答得太晚,我所做的只是直接使用“xml到json”转换,然后将策略中的“set body”部分设置为上下文中转换方法返回的body。这返回了我需要的正确json字符串。由于某些原因,在我的“set body”标记中使用“template=liqd”在我的一生中都无法理解如何输入上下文以获取值,相反,它将整个根属性返回为空。我用Soap来休息,所以我认为后面有很多事情会把事情搞得一团糟。另外,我恐怕无法显示我正在使用的数据,因为这些数据与我工作的公司的集成有关。@John,没问题。事实上,我唯一修改的是:
{%jsonarrayforitem In body.envelope.body.Response where Cargo-%}
{%jsonarrayforitem In body.Response.Truck.Cargo%}
。请检查一下。