如何解决WSO2 ESB json-eval($)
我使用带有 expression=json-eval($) 的属性来记录我在 WSO2 ESB 6.4.0 版中的当前正文。它在每次调用后都有效,但在每次 xqueries 后都无效。
我注意到 xquery 在输出为 </jsonObject>
之后它不起作用。
如果我有像 <objectName></sampleData></objectName>
这样的 xquery 输出,我的两个日志:
<log>
<property name="logInJson" scope="default" type="STRING" expression="json-eval($)"/>
<property name="logInXml" scope="default" type="STRING" expression="$body"/>
</log>
显示相同的数据。
如果我有像 <jsonObject></sampleData></jsonObject>
这样的 xquery 输出,则属性 logInXml
显示正确的数据,但属性 logInJson
显示错误的数据(它显示来自上次调用响应的数据)。>
是否有任何解决方案可以在 json 中记录每个当前主体?
编辑 - 示例:
这是我的 API:
<?xml version="1.0" encoding="UTF-8"?>
<api context="/test" name="Test" xmlns="http://ws.apache.org/ns/synapse">
<resource methods="POST" uri-template="/test">
<inSequence>
<xquery key="gov:resources/normalXmlOutput.xq">
<variable string="myData" name="payload" type="ELEMENT"/>
</xquery>
<log>
<property name="BODY_XML" scope="default" type="STRING" expression="$body"/>
<property name="BODY_JSON" scope="default" type="STRING" expression="json-eval($)"/>
</log>
<xquery key="gov:resources/jsonObjectOutput.xq">
<variable string="myData" name="payload" type="ELEMENT"/>
</xquery>
<log>
<property name="BODY_XML" scope="default" type="STRING" expression="$body"/>
<property name="BODY_JSON" scope="default" type="STRING" expression="json-eval($)"/>
</log>
</inSequence>
<outSequence/>
<faultSequence/>
</resource>
</api>
这是第一个名为 normalXmlOutput.xq 的 xQuery:
<x xmlns="http://ws.apache.org/ns/synapse"><![CDATA[
declare namespace xf = "http://tempuri.org/";
declare function xf:normalXmlOutput($payload as xs:string)
as element(objectName) {
<objectName>
<sampleData>{ $payload }</sampleData>
</objectName>
};
declare variable $payload as xs:string external;
xf:normalXmlOutput($payload)
]]></x>
这里是名为 jsonObjectOutput.xq 的 xQuery:
<x xmlns="http://ws.apache.org/ns/synapse"><![CDATA[
declare namespace xf = "http://tempuri.org/";
declare function xf:jsonObjectOutput($payload as xs:string)
as element(jsonObject) {
<jsonObject>
<sampleData>{ $payload }</sampleData>
</jsonObject>
};
declare variable $payload as xs:string external;
xf:jsonObjectOutput($payload)
]]></x>
请求正文:
{ "payloadRequest": "someValue" }
日志:
[2021-02-09 10:48:28,438] [EI-Core] INFO - LogMediator To: /test/test,MessageID: urn:uuid:20133e1c-f9e4-4f84-953d-4a12274281ac,Direction: request,BODY_XML =
<soapenv:Body xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<objectName>
<sampleData>someValue</sampleData>
</objectName>
</soapenv:Body>,BODY_JSON =
{"objectName":{"sampleData":"someValue"}}
[2021-02-09 10:48:28,442] [EI-Core] INFO - LogMediator To: /test/test,BODY_XML =
<soapenv:Body xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<jsonObject>
<sampleData>someValue</sampleData>
</jsonObject>
</soapenv:Body>,BODY_JSON =
{ "payloadRequest": "someValue" }
正如我所说,xml 中的日志 $body
在两种情况下都显示正确的数据,但 JSON 中的日志 json-eval($)
在第一种情况下显示正确,但在第二种情况下数据是错误的。
解决方法
在这种情况下,应该在记录之前将“messageType”设置为 json。 [1]
<property name="messageType" scope="axis2" value="application/json"/>
在内部,除非特别指定或从源返回,否则所有内容都是 XML,因此将其设置为这样将确保 json-eval 有效。
[1]https://docs.wso2.com/display/EI640/Generic+Properties
,并非每个有效负载都可以被 wso2 包装成正确的 JSON。 $body - 用于从 soap 消息中获取正文:read more here 并且 wso2 在内部使用 XML。
也许 this 将有助于理解 JSON 在 wso2ei 中的工作原理。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。