【发布时间】:2021-05-07 17:58:54
【问题描述】:
我使用带有表达式=json-eval($) 的属性在 WSO2 ESB 版本 6.4.0 中记录我当前的正文。它在每次调用后都有效,但在每次 xquery 后都无效。
我注意到它在输出为</jsonObject> 的 xquery 之后不起作用。
如果我有像<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中记录每一个当前的body?
编辑 - 示例:
这是我的 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, MessageID: urn:uuid:20133e1c-f9e4-4f84-953d-4a12274281ac, Direction: request,
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($) 在第一种情况下显示正确,但在第二种情况下数据是错误的。
【问题讨论】:
-
你能发布整个事情的输出(wso2carbon.log)吗?这可能有助于发现问题。我对使用 json-eval 语句记录的不同值特别感兴趣。
-
@ophychius 我已经添加了我的请求正文和日志。 JSON 中的上次日志显示来自请求的数据,而不是来自 xQuery 的输出。