【问题标题】:WSO2 ESB json-eval($)WSO2 ESB json-eval($)
【发布时间】: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>

显示相同的数据。

如果我有像 &lt;jsonObject&gt;&lt;/sampleData&gt;&lt;/jsonObject&gt; 这样的 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 的输出。

标签: wso2 wso2esb esb wso2ei


【解决方案1】:

不是每个有效负载都可以被 wso2 包装成正确的 JSON。 $body - 用于从 soap 消息中获取正文:read more here 和 wso2 内部使用 XML。

也许this 将有助于理解 JSON 在 wso2ei 中的工作原理。

【讨论】:

  • 登录后,我使用我的&lt;jsonObject&gt;&lt;/sampleData&gt;&lt;/jsonObject&gt; 作为 POST HTTP 方法的主体。我在日志中看不到数据,但我正在调用的服务在正文中接收到sampleData:{}。所以我认为有效载荷已正确包装为 JSON。
【解决方案2】:

在这种情况下,在记录之前将“messageType”设置为 json 应该这样做。 [1]

<property name="messageType" scope="axis2" value="application/json"/> 

除非特别指定或从源返回,否则在内部一切都是 XML,因此这样设置将确保 json-eval 正常工作。

[1]https://docs.wso2.com/display/EI640/Generic+Properties

【讨论】:

  • 我尝试在我的日志前设置 messageType 还是不行。
  • 能否围绕问题添加一些相关代码?很难清楚地了解正在发生的事情。
  • 我已经在主贴添加了相关代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多