使用 foreach 中介程序使用 WSO2 ESB 转换 JSON 数组



我正在使用WSO2 ESB V4.9.0为需要返回转换后的JSON数组的指定端点创建代理服务。我已经设置了一个代理服务,其中包含 out 序列中的 foreach 中介器和有效负载工厂以及日志语句,以查看发生了什么。结果是每个单独的数组元素都按预期进行转换,但是在循环结束时,各个元素不会合并回单个数组正如文档似乎暗示的那样。结果是只返回最后一个元素。

唯一能看到的是,我看到的大多数例子不仅有一个带有数组的元素,而且只有一个数组。有人知道这是否可能吗?

原始终结点返回如下内容:

[
{"id": "1",
"type": "object",
"name": "first",
"bounds":"[[-0.256,51.531],[-0.102,51.656]]",
"displayName": "first record"},
{"id": "2",
"type": "object",
"name": "second",
"bounds":"[[-0.256,51.531],[-0.102,51.656]]",
"displayName": "second record"},
..etc...
]

代理服务所需的返回如下所示:

[
{"name": "first record",
"bounds":"[[-0.256,51.531],[-0.102,51.656]]"},
{"name": "second record",
"bounds":"[[-0.256,51.531],[-0.102,51.656]]"},
..etc...
]

代理的实际回报如下:

{"name": "first record",
"bounds":"[[-0.256,51.531],[-0.102,51.656]]"}

代理的配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="newfeed_v2"
       transports="https,http"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target>
      <inSequence>
         <log/>
      </inSequence>
      <outSequence>
         <log level="full">
            <property name="MESSAGE" value="FIRST"/>
         </log>
         <foreach id="foreach_1" expression="//jsonArray/jsonElement">
            <sequence>
               <payloadFactory media-type="json">
                  <format>{ 
   "name" : "$1", 
   "bounds" : "$2"  
}</format>
                  <args>
                     <arg evaluator="json" expression="$.displayName"/>
                     <arg evaluator="json" expression="$.bounds"/>
                  </args>
               </payloadFactory>
                <log level="full">
                  <property name="MESSAGE" value="ENDLOOP"/>
               </log>
            </sequence>
         </foreach>
         <log level="full">
            <property name="MESSAGE" value="LAST"/>
         </log>
         <log/>
         <send/>
      </outSequence>
      <endpoint>
         <address uri="https://api.backend.com"/>
      </endpoint>
   </target>
   <description/>
</proxy>

您可以尝试将其作为解决方法吗:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="newfeed_v2"
       transports="https,http"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target>
      <inSequence>
         <payloadFactory media-type="json">
            <format>[
            {"id": "1",
            "type": "object",
            "name": "first",
            "bounds":"[[-0.256,51.531],[-0.102,51.656]]",
            "displayName": "first record"},
            {"id": "2",
            "type": "object",
            "name": "second",
            "bounds":"[[-0.256,51.531],[-0.102,51.656]]",
            "displayName": "second record"},
            {"id": "4",
            "type": "object",
            "name": "tercero",
            "bounds":"[[-0.256,51.531],[-0.102,51.656]]",
            "displayName": "tercer record"}
            ]
            </format>
            <args/>
         </payloadFactory>
         <log level="full"/>
         <loopback/>
      </inSequence>
      <outSequence>
         <log level="full">
            <property name="MESSAGE" value="FIRST"/>
         </log>
         <property name="Person" scope="default">
            <value xmlns=""/>
         </property>
         <foreach id="foreach_1" expression="//jsonArray/jsonElement">
            <sequence>
               <payloadFactory media-type="json">
                  <format>{
                            "name" : "$1",
                            "bounds" : "$2"
                            }
                  </format>
                  <args>
                     <arg evaluator="json" expression="$.displayName"/>
                     <arg evaluator="json" expression="$.bounds"/>
                  </args>
               </payloadFactory>
               <enrich>
                  <source clone="true" xpath="$body//jsonObject"/>
                  <target action="child" xpath="$ctx:Person"/>
               </enrich>
               <log level="full">
                  <property name="MESSAGE1" value="ENDLOOP"/>
               </log>
            </sequence>
         </foreach>
         <enrich>
            <source clone="true" xpath="$ctx:Person"/>
            <target type="body"/>
         </enrich>
         <log level="full">
            <property name="MESSAGE" value="ENDLOOP"/>
         </log>
         <!--property name="messageType" value="text/xml" scope="axis2" type="STRING"/--><log level="full">
            <property name="TRANSFORMED MESSAGE" value="LAST"/>
         </log>
         <send/>
      </outSequence>
      <faultSequence/>
   </target>
   <description/>
</proxy>

我的回应:

{"value":[{"name":"first record","bounds":"[[-0.256,51.531],[-0.102,51.656]]"},{"name":"second record","bounds":"[[-0.256,51.531],[-0.102,51.656]]"},{"name":"tercer record","bounds":"[[-0.256,51.531],[-0.102,51.656]]"}]}

为每个中介器会将拆分的表达式添加到根元素中,所以我这样做了,

<api context="/foreach" name="foreach" xmlns="http://ws.apache.org/ns/synapse">
    <resource methods="GET">
        <inSequence>
            <payloadFactory media-type="json">
                <format>[
            {"id": "1",
            "type": "object",
            "name": "first",
            "bounds":"[[-0.256,51.531],[-0.102,51.656]]",
            "displayName": "first record"},
            {"id": "2",
            "type": "object",
            "name": "second",
            "bounds":"[[-0.256,51.531],[-0.102,51.656]]",
            "displayName": "second record"},
            {"id": "4",
            "type": "object",
            "name": "tercero",
            "bounds":"[[-0.256,51.531],[-0.102,51.656]]",
            "displayName": "tercer record"}
            ]
                </format>
                <args/>
            </payloadFactory>
            <log level="full">
            </log>
            <foreach expression="//jsonArray/jsonElement">
                <sequence>
                    <payloadFactory media-type="xml">
                        <format>
                            <result xmlns="">
                                <name>$1</name>
                                <bounds>$2</bounds>
                            </result>
                        </format>
                        <args>
                            <arg evaluator="json" expression="$.displayName"/>
                            <arg evaluator="json" expression="$.bounds"/>
                        </args>
                    </payloadFactory>
                </sequence>
            </foreach>
            <property name="messageType" scope="axis2" type="STRING" value="application/json"/>
            <log level="full"/>
            <respond/>
        </inSequence>
        <outSequence>
            <send/>
        </outSequence>
        <faultSequence/>
    </resource>
</api>

我得到了这样的回应

{ "result": [{"name": "first record","bounds": [[-0.256,51.531],[-0.102,51.656]]},{"name": "second record","bounds": [[-0.256,51.531],[-0.102,51.656]]},{"name": "tercer record","bounds": [[-0.256,51.531],[-0.102,51.656]]}]}

最新更新