如何使用 enrich mediator WSO2 动态添加 json 元素?
How to dynamically add a json element using enrich mediator WSO2?
我试过使用
<property name="messageType" scope="axis2" type="STRING" value="application/xml"/>
<property expression="get-property('orderSourceSF')" name="orderSource" scope="default" type="STRING"/>
<enrich description="">
<source type="property" property="orderSource"></source>
<target action="child" xpath="$body//jsonObject"/>
</enrich>
<property name="messageType" scope="axis2" type="STRING" value="application/json"/>
<payloadFactory media-type="json">
<format>{request : }</format>
<args>
<arg evaluator="xml" expression="$body//jsonObject"/>
</args>
</payloadFactory>
这里我需要将一个名为 orderSouce 的元素添加到现有的有效负载中。我怎样才能插入那个元素。
现有负载是一个 json 请求。
我正在捕获 orderSource 的值,但不知道如何插入元素 orderSource 和值。
我相信您可以使用如下中介来实现您的用例。
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
name="enrichProxy"
startOnLoad="true"
statistics="disable"
trace="disable"
transports="http,https">
<target>
<inSequence>
<property expression="json-eval($)"
name="orderSource"
scope="default"
type="STRING"/>
<log>
<property expression="json-eval($)" name="orderSource"/>
</log>
<call>
<endpoint>
<address uri="http://run.mocky.io/v3/9cf4b844-57c1-4fa5-a101-881dc36385bd"/>
</endpoint>
</call>
<log level="full"/>
<property name="messageType"
scope="axis2"
type="STRING"
value="application/json"/>
<enrich>
<source clone="false" property="orderSource" type="property"/>
<target action="child" xpath="json-eval($)"/>
</enrich>
<payloadFactory media-type="json">
<format>{"request" : }</format>
<args>
<arg evaluator="json" expression="$"/>
</args>
</payloadFactory>
<respond/>
</inSequence>
</target>
<description/>
</proxy>
让我解释一下我在这里做了什么。由于您正在处理 JSON 有效载荷,请在中介中使用 JSON 路径 [1] 而不是 XPATH。这将避免在中介中进行不必要的数据转换。
我们正在使用以下负载调用上述代理服务。
{"orderSource":"value"}
我们正在使用 JSON 路径捕获此有效载荷,并将该值存储在 属性 中介 orderSource 中。然后我们进行端点调用,它将 return 以下 JSON 有效载荷。
{"first":"response"}
据我了解,您想将 属性 中介的值添加为第二个有效负载中的子元素。因此,通过 enrich mediator,我们可以实现以下 payload。
{
"first": "response",
"orderSource": "value"
}
您似乎想将此生成的有效载荷作为值添加到另一个 JSON 元素中,因此我使用了有效载荷工厂调解器来实现此用例。因此,这将在负载工厂调解后产生以下负载。
{
"request": {
"first": "response",
"orderSource": "value"
}
}
[1]-https://docs.wso2.com/display/EI600/JSON+支持
已更新
我修改了中介以使用 XPTH 函数而不是 JSON 路径。请参考以下示例配置。
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
name="enrichProxy2"
startOnLoad="true"
statistics="disable"
trace="disable"
transports="http,https">
<target>
<inSequence>
<property name="messageType"
scope="axis2"
type="STRING"
value="application/xml"/>
<enrich>
<source clone="true" xpath="$body//jsonObject/*"/>
<target property="orderSource" type="property"/>
</enrich>
<call>
<endpoint>
<address uri="http://run.mocky.io/v3/9cf4b844-57c1-4fa5-a101-881dc36385bd"/>
</endpoint>
</call>
<enrich>
<source clone="false" property="orderSource" type="property"/>
<target action="child" xpath="//jsonObject"/>
</enrich>
<enrich>
<source clone="true" xpath="//jsonObject"/>
<target type="body"/>
</enrich>
<respond/>
</inSequence>
</target>
<description/>
</proxy>
更新 2
要防止自动数据转换,您需要在 [ESB_HOME]/repository/conf/synapse.properties 文件 [2].
中配置 synapse.commons.json.output.autoPrimitive = false
[2]-https://www.yenlo.com/blog/wso2torial-json-magic-in-wso2-esb-5.0.0
我试过使用
<property name="messageType" scope="axis2" type="STRING" value="application/xml"/>
<property expression="get-property('orderSourceSF')" name="orderSource" scope="default" type="STRING"/>
<enrich description="">
<source type="property" property="orderSource"></source>
<target action="child" xpath="$body//jsonObject"/>
</enrich>
<property name="messageType" scope="axis2" type="STRING" value="application/json"/>
<payloadFactory media-type="json">
<format>{request : }</format>
<args>
<arg evaluator="xml" expression="$body//jsonObject"/>
</args>
</payloadFactory>
这里我需要将一个名为 orderSouce 的元素添加到现有的有效负载中。我怎样才能插入那个元素。 现有负载是一个 json 请求。 我正在捕获 orderSource 的值,但不知道如何插入元素 orderSource 和值。
我相信您可以使用如下中介来实现您的用例。
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
name="enrichProxy"
startOnLoad="true"
statistics="disable"
trace="disable"
transports="http,https">
<target>
<inSequence>
<property expression="json-eval($)"
name="orderSource"
scope="default"
type="STRING"/>
<log>
<property expression="json-eval($)" name="orderSource"/>
</log>
<call>
<endpoint>
<address uri="http://run.mocky.io/v3/9cf4b844-57c1-4fa5-a101-881dc36385bd"/>
</endpoint>
</call>
<log level="full"/>
<property name="messageType"
scope="axis2"
type="STRING"
value="application/json"/>
<enrich>
<source clone="false" property="orderSource" type="property"/>
<target action="child" xpath="json-eval($)"/>
</enrich>
<payloadFactory media-type="json">
<format>{"request" : }</format>
<args>
<arg evaluator="json" expression="$"/>
</args>
</payloadFactory>
<respond/>
</inSequence>
</target>
<description/>
</proxy>
让我解释一下我在这里做了什么。由于您正在处理 JSON 有效载荷,请在中介中使用 JSON 路径 [1] 而不是 XPATH。这将避免在中介中进行不必要的数据转换。
我们正在使用以下负载调用上述代理服务。
{"orderSource":"value"}
我们正在使用 JSON 路径捕获此有效载荷,并将该值存储在 属性 中介 orderSource 中。然后我们进行端点调用,它将 return 以下 JSON 有效载荷。
{"first":"response"}
据我了解,您想将 属性 中介的值添加为第二个有效负载中的子元素。因此,通过 enrich mediator,我们可以实现以下 payload。
{
"first": "response",
"orderSource": "value"
}
您似乎想将此生成的有效载荷作为值添加到另一个 JSON 元素中,因此我使用了有效载荷工厂调解器来实现此用例。因此,这将在负载工厂调解后产生以下负载。
{
"request": {
"first": "response",
"orderSource": "value"
}
}
[1]-https://docs.wso2.com/display/EI600/JSON+支持
已更新
我修改了中介以使用 XPTH 函数而不是 JSON 路径。请参考以下示例配置。
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
name="enrichProxy2"
startOnLoad="true"
statistics="disable"
trace="disable"
transports="http,https">
<target>
<inSequence>
<property name="messageType"
scope="axis2"
type="STRING"
value="application/xml"/>
<enrich>
<source clone="true" xpath="$body//jsonObject/*"/>
<target property="orderSource" type="property"/>
</enrich>
<call>
<endpoint>
<address uri="http://run.mocky.io/v3/9cf4b844-57c1-4fa5-a101-881dc36385bd"/>
</endpoint>
</call>
<enrich>
<source clone="false" property="orderSource" type="property"/>
<target action="child" xpath="//jsonObject"/>
</enrich>
<enrich>
<source clone="true" xpath="//jsonObject"/>
<target type="body"/>
</enrich>
<respond/>
</inSequence>
</target>
<description/>
</proxy>
更新 2
要防止自动数据转换,您需要在 [ESB_HOME]/repository/conf/synapse.properties 文件 [2].
中配置 synapse.commons.json.output.autoPrimitive = false[2]-https://www.yenlo.com/blog/wso2torial-json-magic-in-wso2-esb-5.0.0