WSO2 REST API 用于在 WSO2 EI 6.1.1

发布时间:2021-03-05 12:07

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

收到无效的 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"}
回答1

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

回答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 无法处理这样的特殊字符,因此会抛出异常。

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