【问题标题】:WSO2 REST API to capture invalid/valid xml request in WSO2 EI 6.1.1WSO2 REST API 在 WSO2 EI 6.1.1 中捕获无效/有效 xml 请求
【发布时间】:2021-03-05 12:07:42
【问题描述】:

我正在使用 WSO2 EI 6.1.1。我设计了接收 xml 有效负载作为请求的 Rest API。在这种情况下,如果请求有效,我可以通过使用日志调解器打印传入的请求有效负载,通常如果请求错误,不幸的是无法获得发送到我的系统的确切请求。

收到无效的 xml 请求时出现以下异常。

Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character ' ' (code 32) (missing name?)

我需要捕获客户端发送的输入请求是否有效。请帮我解决这个问题。

API 代码:

<?xml version="1.0" encoding="UTF-8"?>
<api context="/WSO2API" name="WSO2API" xmlns="http://ws.apache.org/ns/synapse">
    <resource methods="POST">
        <inSequence>
            <log level="custom">
                <property name="API Logger"
                    value="====Inside QRSag_NAC Lead Creation API Process Started====" />
                <property name="===Input Request Logger===" expression="$body" />
            </log>
            <log level="full" />
            <payloadFactory media-type="json" description="Form Response Payload">
                <format>{"StatusCode":"$1","Message":"$2"}</format>
                <args>
                    <arg value="200" />
                    <arg value="Success" />
                </args>
            </payloadFactory>
            <log level="custom">
            <property name="==Response==" expression="json-eval($.)"></property>
            </log>
            <property name="HTTP_SC" value="400" scope="axis2" type="STRING"
                description="HTTPStatusCode" />
            <property name="messageType" value="application/json" scope="axis2"
                type="STRING" description="HttpMessageType" />
            <respond />
        </inSequence>
        <outSequence />
        <faultSequence>
            <log level="custom" separator=",**, " description="FaultSequence">
                <property name="=====Faulty Response=====" value="Inside default Fault Sequence" />
                <property name="=====message=====" expression="get-property('ERROR_MESSAGE')" />

            </log>

            <payloadFactory media-type="json" description="Form Response Payload">
                <format>{"StatusCode":"$1","Message":"$2"}</format>
                <args>
                    <arg value="400" />
                    <arg value="Failure" />
                </args>
            </payloadFactory>
            <property name="HTTP_SC" value="400" scope="axis2" type="STRING"
                description="HTTPStatusCode" />
            <property name="messageType" value="application/json" scope="axis2"
                type="STRING" description="HttpMessageType" />
                <log level="custom">
            <property name="==Response==" expression="json-eval($.)"></property>
            </log>
            <respond />
        </faultSequence>
    </resource>
</api>

有效请求:

<leaddetails>
    <customer>
        <extdburn>0</extdburn>
        <title/>
        <forename>Jared</forename>
        <surname>Parker</surname>
        <mobile>0406008974</mobile>
        <email>Jwparke888@hotmail.com</email>
    </customer>
    
</leaddetails>

无效请求:

<leaddetails>
    <customer>
        <extdburn>0</extdburn>
        <title/>
        <forename>**Jared & Justin**</forename>
        <surname>Parker</surname>
        <mobile>0406008000</mobile>
        <email>Jwparke888@hotmail.com</email>
    </customer>
    
</leaddetails>

日志:

[2021-03-05 17:27:54,003] []  INFO - LogMediator API Logger = ====Inside QRSag_NAC Lead Creation API Process Started====, ===Input Request Logger=== = <soapenv:Body xmlns:soapenv="h
ttp://schemas.xmlsoap.org/soap/envelope/"/>
[2021-03-05 17:27:54,004] [] ERROR - LogMediator Could not build full log message: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character ' ' (code 32) (missing name?)
 at [row,col {unknown-source}]: [6,26]
org.apache.axiom.om.OMException: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character ' ' (code 32) (missing name?)
 at [row,col {unknown-source}]: [6,26]
        at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:296)
        at org.apache.axiom.om.impl.llom.OMElementImpl.buildNext(OMElementImpl.java:653)
        at org.apache.axiom.om.impl.llom.OMNodeImpl.getNextOMSibling(OMNodeImpl.java:122)
        at org.apache.axiom.om.impl.traverse.OMChildrenIterator.getNextNode(OMChildrenIterator.java:36)
        at org.apache.axiom.om.impl.traverse.OMAbstractIterator.hasNext(OMAbstractIterator.java:58)
        at org.apache.axiom.om.impl.util.OMSerializerUtil.serializeChildren(OMSerializerUtil.java:554)
        at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:875)
        at org.apache.axiom.om.impl.util.OMSerializerUtil.serializeChildren(OMSerializerUtil.java:555)
        at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:875)
        at org.apache.axiom.om.impl.util.OMSerializerUtil.serializeChildren(OMSerializerUtil.java:555)
        at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:875)
        at org.apache.axiom.om.impl.util.OMSerializerUtil.serializeChildren(OMSerializerUtil.java:555)
        at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:875)
        at org.apache.axiom.soap.impl.llom.SOAPEnvelopeImpl.internalSerialize(SOAPEnvelopeImpl.java:230)
        at org.apache.axiom.om.impl.llom.OMSerializableImpl.serialize(OMSerializableImpl.java:125)
        at org.apache.axiom.om.impl.llom.OMSerializableImpl.serialize(OMSerializableImpl.java:113)
        at org.apache.axiom.om.impl.llom.OMElementImpl.toString(OMElementImpl.java:988)
        at java.lang.String.valueOf(String.java:2994)
        at java.lang.StringBuffer.append(StringBuffer.java:265)
        at org.apache.synapse.mediators.builtin.LogMediator.getFullLogMessage(LogMediator.java:203)
        at org.apache.synapse.mediators.builtin.LogMediator.getLogMessage(LogMediator.java:138)
        at org.apache.synapse.mediators.builtin.LogMediator.mediate(LogMediator.java:101)
        at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:97)
        at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:59)
        at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158)
        at org.apache.synapse.rest.Resource.process(Resource.java:343)
        at org.apache.synapse.rest.API.process(API.java:399)
        at org.apache.synapse.rest.RESTRequestHandler.apiProcess(RESTRequestHandler.java:123)
        at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:101)
        at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:69)
        at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:304)
        at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:78)
        at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
        at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:326)
        at org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:372)
        at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:151)
        at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character ' ' (code 32) (missing name?)
 at [row,col {unknown-source}]: [6,26]
        at com.ctc.wstx.sr.StreamScanner.throwUnexpectedChar(StreamScanner.java:639)
        at com.ctc.wstx.sr.StreamScanner.parseFullName(StreamScanner.java:1924)
        at com.ctc.wstx.sr.StreamScanner.parseEntityName(StreamScanner.java:2050)
        at com.ctc.wstx.sr.StreamScanner.resolveNonCharEntity(StreamScanner.java:1479)
        at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2788)
        at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1072)
        at org.apache.axiom.util.stax.wrapper.XMLStreamReaderWrapper.next(XMLStreamReaderWrapper.java:225)
        at org.apache.axiom.util.stax.dialect.DisallowDoctypeDeclStreamReaderWrapper.next(DisallowDoctypeDeclStreamReaderWrapper.java:34)
        at org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:681)
        at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:214)
        ... 39 more
[2021-03-05 17:27:54,015] [] ERROR - WSO2API Could not build full log message: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character ' ' (code 32) (missing name?)
 at [row,col {unknown-source}]: [6,26]
org.apache.axiom.om.OMException: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character ' ' (code 32) (missing name?)
 at [row,col {unknown-source}]: [6,26]
        at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:296)
        at org.apache.axiom.om.impl.llom.OMElementImpl.buildNext(OMElementImpl.java:653)
        at org.apache.axiom.om.impl.llom.OMNodeImpl.getNextOMSibling(OMNodeImpl.java:122)
        at org.apache.axiom.om.impl.traverse.OMChildrenIterator.getNextNode(OMChildrenIterator.java:36)
        at org.apache.axiom.om.impl.traverse.OMAbstractIterator.hasNext(OMAbstractIterator.java:58)
        at org.apache.axiom.om.impl.util.OMSerializerUtil.serializeChildren(OMSerializerUtil.java:554)
        at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:875)
        at org.apache.axiom.om.impl.util.OMSerializerUtil.serializeChildren(OMSerializerUtil.java:555)
        at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:875)
        at org.apache.axiom.om.impl.util.OMSerializerUtil.serializeChildren(OMSerializerUtil.java:555)
        at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:875)
        at org.apache.axiom.om.impl.util.OMSerializerUtil.serializeChildren(OMSerializerUtil.java:555)
        at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:875)
        at org.apache.axiom.soap.impl.llom.SOAPEnvelopeImpl.internalSerialize(SOAPEnvelopeImpl.java:230)
        at org.apache.axiom.om.impl.llom.OMSerializableImpl.serialize(OMSerializableImpl.java:125)
        at org.apache.axiom.om.impl.llom.OMSerializableImpl.serialize(OMSerializableImpl.java:113)
        at org.apache.axiom.om.impl.llom.OMElementImpl.toString(OMElementImpl.java:988)
        at java.lang.String.valueOf(String.java:2994)
        at java.lang.StringBuffer.append(StringBuffer.java:265)
        at org.apache.synapse.mediators.builtin.LogMediator.getFullLogMessage(LogMediator.java:203)
        at org.apache.synapse.mediators.builtin.LogMediator.getLogMessage(LogMediator.java:138)
        at org.apache.synapse.mediators.builtin.LogMediator.mediate(LogMediator.java:101)
        at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:97)
        at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:59)
        at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158)
        at org.apache.synapse.rest.Resource.process(Resource.java:343)
        at org.apache.synapse.rest.API.process(API.java:399)
        at org.apache.synapse.rest.RESTRequestHandler.apiProcess(RESTRequestHandler.java:123)
        at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:101)
        at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:69)
        at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:304)
        at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:78)
        at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
        at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:326)
        at org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:372)
        at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:151)
        at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character ' ' (code 32) (missing name?)
 at [row,col {unknown-source}]: [6,26]
        at com.ctc.wstx.sr.StreamScanner.throwUnexpectedChar(StreamScanner.java:639)
        at com.ctc.wstx.sr.StreamScanner.parseFullName(StreamScanner.java:1924)
        at com.ctc.wstx.sr.StreamScanner.parseEntityName(StreamScanner.java:2050)
        at com.ctc.wstx.sr.StreamScanner.resolveNonCharEntity(StreamScanner.java:1479)
        at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2788)
        at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1072)
        at org.apache.axiom.util.stax.wrapper.XMLStreamReaderWrapper.next(XMLStreamReaderWrapper.java:225)
        at org.apache.axiom.util.stax.dialect.DisallowDoctypeDeclStreamReaderWrapper.next(DisallowDoctypeDeclStreamReaderWrapper.java:34)
        at org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:681)
        at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:214)
        ... 39 more
[2021-03-05 17:27:54,036] []  INFO - LogMediator =====Faulty Response===== = Inside default Fault Sequence,**, =====message===== = Could not build full log message: com.ctc.wstx.exc
.WstxUnexpectedCharException: Unexpected character ' ' (code 32) (missing name?)
[2021-03-05 17:27:54,037] []  INFO - LogMediator ==Response== = {"StatusCode":"400","Message":"Failure"}

【问题讨论】:

    标签: xml wso2 wso2esb rest wso2ei


    【解决方案1】:

    致敬!我有一个类似的问题,也许用Unicode替换符号'**'会对你有所帮助。您可以找到您需要的代码,例如 [1]:https://unicode-table.com/

    【讨论】:

    • 嗨@Andrey Guzik,感谢您的建议,问题是我正在通过和请求。正如 Niitha 建议的那样,我需要将 & 替换为 &在请求中,但是客户端发送的请求..我的问题是我无法在日志中获取客户端发送的请求。如果我收到此输入请求,那么只有我可以替换。对吗?
    【解决方案2】:

    使用上述 API 配置和无效的请求负载,可以使用 WSO2 EI 6.1.1 轻松重现此问题。

    [2021-03-05 17:27:54,004] [] ERROR - LogMediator Could not build full log message: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character ' ' (code 32) (missing name?) 
        at [row,col {unknown-source}]: [6,26]
    org.apache.axiom.om.OMException: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character ' ' (code 32) (missing name?)
        at [row,col {unknown-source}]: [6,26]
    

    当 WSO2 EI 尝试在完整的日志中介中构建消息负载时,会引发上述错误。由于无效请求有效负载中的“&”字符,问题正在发生。这是一个特殊字符,WSO2 EI 无法处理此类特殊字符,因此会引发异常。

    如果您真的想在请求负载中使用“&”字符,则需要使用转义字符 (&) 以避免中断流程。

    【讨论】:

    • 嗨@Nikitha Udeshana,感谢您的回复。是的,您是正确的,需要对请求进行更改,以上是我为单元测试目的而形成的无效请求,因为请求是由客户端发送的,在这种情况下,我如何才能在我的日志中获取该无效请求,否则我需要联系客户端发送有效的请求?
    • 嗨@Justin,根据XML specification,与号字符(&)和左尖括号(wire logs 来检查消息负载,而无需使用完整日志中介。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多