mep*_*ist 4 xml json wso2 wso2esb
我的后端服务响应XML,我默认返回它.
如果客户端给我一个adds参数(比如:&outout_format = json),我需要在"outSequence"中将响应转换为JSON.
例如:
<result>
<foo>bar</foo>
<foo2>bar2</foo2>
<nested>
<node>value</node>
</nested>
</result>
Run Code Online (Sandbox Code Playgroud)
应该作为回应
{
"foo": "bar",
"foo2": "bar2",
"nested":{
"node":"value"
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个测试代理服务(我只是在这里使用inSequence来显示问题):
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
name="JSONtest"
transports="https,http"
statistics="disable"
trace="disable"
startOnLoad="true">
<target>
<inSequence>
<property name="TEST_WAITING_FOR"
value="json"
scope="default"
type="STRING"/>
<header name="To" action="remove"/>
<property name="RESPONSE" value="true"/>
<property name="NO_ENTITY_BODY" scope="axis2" action="remove"/>
<payloadFactory media-type="xml">
<format>
<response xmlns="">
<result>success</result>
<code>123</code>
</response>
</format>
<args/>
</payloadFactory>
<switch source="get-property('TEST_WAITING_FOR')">
<case regex="json">
<property name="messageType"
value="application/json"
scope="axis2"
type="STRING"/>
</case>
<default>
<property name="messageType" value="text/xml" scope="axis2" type="STRING"/>
</default>
</switch>
<send/>
</inSequence>
</target>
<description/>
Run Code Online (Sandbox Code Playgroud)
它回应:
{"response":{"result":"success","code":123}}
Run Code Online (Sandbox Code Playgroud)
有没有办法删除根节点"响应",使其看起来像这样?
{"result":"success","code":123}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用Enrich-mediator(例如$ body/result/* - > $ body/*)删除节点"result"时,它变为带有多个根节点的无效XML,而JSON只包含第一个节点.
我知道有可能Payload一个JSON消息,但后端可以返回一个具有不同格式和不同数量的嵌套节点的XML,所以我不能将它硬编码为JSON.
看来我需要实现自己的JSONMessageFromatter?(任何代码示例?)
UPD:我找到了解决方案(感谢Dakshika)
<payloadFactory media-type="json">
<format>$1</format>
<args>
<arg expression="$.response" evaluator="json"></arg>
</args>
</payloadFactory>
Run Code Online (Sandbox Code Playgroud)
在ESB 4.7版本中,有效负载工厂介体支持多种介质类型,xml和json,您可以相应地进行更改.
请尝试以下链接
http://wso2.com/library/articles/2013/12/restful-integration-with-wso2-esb/