2

我正在通过 WSO2 EI 创建简单的 REST API。我正在发送这个json:

{
    "array": ["Hello", "this", "is", "an", "arrray", "1", 3, 4]
}

我想遍历数组中的每个元素并在日志中显示它们。

我为它创建了这种序列:

<?xml version="1.0" encoding="UTF-8"?>
<sequence name="for_each_test_seq_in" trace="enable" xmlns="http://ws.apache.org/ns/synapse">
    <property expression="json-eval($.array)" name="array"
    scope="default" type="STRING" xmlns:ns="http://org.apache.synapse/xsd"/>
    <log level="full">
        <property expression="get-property('array')" name="ARRAY" xmlns:ns="http://org.apache.synapse/xsd"/>
    </log>
    <iterate expression="get-property('array')" id="iterate_one" xmlns:ns="http://org.apache.synapse/xsd">
        <target sequence="anon">
            <sequence>
                <log level="full"/>
            </sequence>
        </target>
    </iterate>
    <respond/>
</sequence>

当我启动它时,我收到以下错误消息:

[2017-09-19 16:06:40,236] [] ERROR - SynapseXPath Evaluation of the XPath expression get-property('array') resulted in an error
org.jaxen.UnresolvableException: No Such Function get-property
    at 
org.jaxen.SimpleFunctionContext.getFunction(SimpleFunctionContext.java:127)
    at org.jaxen.ContextSupport.getFunction(ContextSupport.java:242)
    at org.jaxen.Context.getFunction(Context.java:216)
    ...

我不明白为什么get-property它是未知的。我知道这get-property是一个 XPath 函数。

我只想遍历 element 的每个元素array并对它们做一些事情。

是否可以?

4

1 回答 1

0

这里是实现。

休息服务的 WSO API。接收请求,记录消息正文,按顺序处理并发送回客户端。序列for_each_test_seq_in不会改变消息的内容

<?xml version="1.0" encoding="UTF-8"?>
<api context="/array" name="array" xmlns="http://ws.apache.org/ns/synapse">
    <resource methods="POST">
        <inSequence>
            <log>
                <property expression="json-eval($.*)" name="==============="/>
            </log>
            <sequence key="for_each_test_seq_in"/>
            <loopback/>
        </inSequence>
        <outSequence>
            <send/>
        </outSequence>
        <faultSequence/>
    </resource>
</api>

这是序列码

<?xml version="1.0" encoding="UTF-8"?>
<sequence name="for_each_test_seq_in" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
    <property expression="json-eval($.array)" name="array" scope="default" type="STRING"/>
    <log level="full">
        <property expression="get-property('array')" name="ARRAY" xmlns:ns="http://org.apache.synapse/xsd"/>
    </log>
    <foreach expression="//array">
        <sequence>
            <log level="full"/>
        </sequence>
    </foreach>
</sequence>

下图发帖请求示例 SoapUI 请求响应

服务器状态日志

[2017-10-16 23:55:18,375] [EI-Core]  INFO - LogMediator To: /array, MessageID: urn:uuid:648f7e51-4c71-48d7-8d09-f914ce29a867, Direction: request, =============== = [[34,234,"example",56.3,"mom"]]
[2017-10-16 23:55:18,379] [EI-Core]  INFO - LogMediator To: /array, MessageID: urn:uuid:648f7e51-4c71-48d7-8d09-f914ce29a867, Direction: request, ARRAY = [34,234,"example",56.3,"mom"], Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><jsonObject><array>34</array><array>234</array><array>example</array><array>56.3</array><array>mom</array></jsonObject></soapenv:Body></soapenv:Envelope>
[2017-10-16 23:55:18,380] [EI-Core]  INFO - LogMediator To: /array, MessageID: urn:uuid:648f7e51-4c71-48d7-8d09-f914ce29a867, Direction: request, Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><array>34</array></soapenv:Body></soapenv:Envelope>
[2017-10-16 23:55:18,381] [EI-Core]  INFO - LogMediator To: /array, MessageID: urn:uuid:648f7e51-4c71-48d7-8d09-f914ce29a867, Direction: request, Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><array>234</array></soapenv:Body></soapenv:Envelope>
[2017-10-16 23:55:18,381] [EI-Core]  INFO - LogMediator To: /array, MessageID: urn:uuid:648f7e51-4c71-48d7-8d09-f914ce29a867, Direction: request, Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><array>example</array></soapenv:Body></soapenv:Envelope>
[2017-10-16 23:55:18,381] [EI-Core]  INFO - LogMediator To: /array, MessageID: urn:uuid:648f7e51-4c71-48d7-8d09-f914ce29a867, Direction: request, Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><array>56.3</array></soapenv:Body></soapenv:Envelope>
[2017-10-16 23:55:18,382] [EI-Core]  INFO - LogMediator To: /array, MessageID: urn:uuid:648f7e51-4c71-48d7-8d09-f914ce29a867, Direction: request, Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><array>mom</array></soapenv:Body></soapenv:Envelope>

第一行表示为

<log><property expression="json-eval($.*)" name="==============="/></log>
 ...=============== = [[34,234,"example",56.3,"mom"]]

第二个日志行是部分代码的结果

<log level="full">
    <property expression="get-property('array')" name="ARRAY"/>
</log>
  ....Direction: request, ARRAY = [34,234,"example",56.3,"mom"], Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><jsonObject><array>34</array><array>234</array><array>example</array><array>56.3</array><array>mom</array></jsonObject></soapenv:Body></soapenv:Envelope>

如您所见,它有两种表示形式。一种是json格式:

ARRAY = [34,234,"example",56.3,"mom"]

其次是根据https://docs.wso2.com/display/ESB500/JSON+Support中描述的规则以 xml 表示法( JSON 有效负载的 XML 表示一章)

<?xml version='1.0' encoding='utf-8'?>
   <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
           <soapenv:Body>
               <jsonObject>
                   <array>34</array>
                   <array>234</array>
                   <array>example</array>
                   <array>56.3</array>
                   <array>mom</array>
           </jsonObject>
    </soapenv:Body>
</soapenv:Envelope>

文档指出,如果您考虑 xml 中的 json 表示,则可以在 json 有效负载上应用 xpath。使用它只需申请每个使用 xpath //array获取数组的每个部分

结果原始数组,以 xml 表示,被数组的每个元素吐出并登录到控制台。您可以在其余日志中看到它

LogMediator To: /array, MessageID: urn:uuid:6...  Envelope: <soapenv:Body><array>34</array></soapenv:Body>
LogMediator To: /array, MessageID: urn:uuid:6.... Envelope: <soapenv:Body><array>234</array></soapenv:Body>
LogMediator To: /array, MessageID: urn:uuid:6...  Envelope: <soapenv:Body><array>example</array></soapenv:Body>
LogMediator To: /array, MessageID: urn:uuid:6.... Envelope: <soapenv:Body><array>56.3</array></soapenv:Body>
LogMediator To: /array, MessageID: urn:uuid:6.... Envelope: <soapenv:Body><array>mom</array></soapenv:Body>
于 2017-10-16T21:21:19.530 回答