WSO2 API 经理将 JSON 转换为 XML(请求失败)
WSO2 API Manager Converting JSON to XML (and failing the request)
我们正在使用 WSO2 API 管理器作为 API 网关。我拥有的 API 之一是 JSON-only not-fully-restful API。它使用带有 JSON 的 HTTP POST 请求作为数据交换格式。我对此有一个非常基本的配置:配置为 REST API,允许 POST /*。
一些响应包括 JSON,它具有像 "P~A"
这样的字符串作为对象键。当我尝试通过网关调用它时,它会在响应中阻塞:
2018-09-13 18:37:37,890 [-] [PassThroughMessageProcessor-36] ERROR JsonUtil #writeAsJson. Could not convert OMElement to JSON. Invalid XML payload. Error>>> Unexpected character '~' (code 126) excepted space, or '>' or "/>"
at [row,col {unknown-source}]: [1,4956]
2018-09-13 18:37:37,891 [-] [PassThroughMessageProcessor-36] ERROR PassThroughHttpSSLSender Failed to submit the response
org.apache.axis2.AxisFault: Could not convert OMElement to JSON. Invalid XML payload.
at org.apache.synapse.commons.json.JsonUtil.writeAsJson(JsonUtil.java:372)
at org.apache.synapse.commons.json.JsonFormatter.writeTo(JsonFormatter.java:84)
at org.apache.synapse.transport.passthru.PassThroughHttpSender.submitResponse(PassThroughHttpSender.java:573)
at org.apache.synapse.transport.passthru.PassThroughHttpSender.invoke(PassThroughHttpSender.java:264)
at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:442)
at org.apache.synapse.core.axis2.Axis2Sender.sendBack(Axis2Sender.java:230)
at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.send(Axis2SynapseEnvironment.java:531)
at org.apache.synapse.mediators.builtin.SendMediator.mediate(SendMediator.java:118)
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:338)
at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:90)
at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:56)
at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:304)
at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:554)
at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:188)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:262)
at org.apache.axis2.transport.base.threads.NativeWorkerPool.run(NativeWorkerPool.java:172)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '~' (code 126) excepted space, or '>' or "/>"
at [row,col {unknown-source}]: [1,4956]
at com.ctc.wstx.sr.StreamScanner.throwUnexpectedChar(StreamScanner.java:647)
at com.ctc.wstx.sr.BasicStreamReader.handleNsAttrs(BasicStreamReader.java:2996)
at com.ctc.wstx.sr.BasicStreamReader.handleStartElem(BasicStreamReader.java:2963)
at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2839)
at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1073)
at javax.xml.stream.util.StreamReaderDelegate.next(Unknown Source)
at javax.xml.stream.util.StreamReaderDelegate.next(Unknown Source)
at org.codehaus.stax2.ri.Stax2ReaderAdapter.next(Stax2ReaderAdapter.java:129)
at org.codehaus.stax2.ri.Stax2EventReaderImpl.peek(Stax2EventReaderImpl.java:367)
at org.apache.synapse.commons.staxon.core.event.SimpleXMLEventWriter.add(SimpleXMLEventWriter.java:118)
at org.apache.synapse.commons.json.JsonUtil.writeAsJson(JsonUtil.java:368)
... 23 more
2018-09-13 18:37:37,892 [-] [PassThroughMessageProcessor-36] ERROR Axis2Sender Access-Control-Allow-Headers:authorization,Access-Control-Allow-Origin,Content-Type,SOAPAction,Access-Control-Allow-Methods:HEAD,DELETE,POST,PATCH,PUT,GET,Access-Control-Allow-Origin:*,Content-Type:application/json;charset=utf-8,<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><jsonObject>
(然后继续并包含 XML,它尝试使用 JSON 中的 "P~A"
键作为 <P~A>
XML 标签,这就是它窒息了)
API 定义不 启用了消息中介并且禁用了响应缓存。所以,我不清楚为什么它甚至使用调解器并试图将我的 JSON 响应完全转换为 XML。
所以,问题是:如何让它发挥作用?通过配置它来应对将其转换为 XML 还是不需要?
我还要注意到这个过程中的某些事情需要很长时间。我花了很长时间才收到(错误)响应,但我看到响应数据很快到达 API 管理器。
我们也有 WSO2 分析服务 运行。我试着阻止它以防它导致问题。没有帮助
我将此作为答案发布,因为它可以解决问题。添加
synapse.commons.json.buildValidNCNames=true
到 repository/conf/synapse.properties
文件。
它使用字符代码处理 ~
(以及标签中任何其他无效的内容)。
我想也许中介不是消息中介(已禁用),而是更内部的东西。在那种情况下,我真的不明白为什么上面的设置不是默认值——我没有看到它的缺点,没有它,网关无法处理某些 JSON!
我们正在使用 WSO2 API 管理器作为 API 网关。我拥有的 API 之一是 JSON-only not-fully-restful API。它使用带有 JSON 的 HTTP POST 请求作为数据交换格式。我对此有一个非常基本的配置:配置为 REST API,允许 POST /*。
一些响应包括 JSON,它具有像 "P~A"
这样的字符串作为对象键。当我尝试通过网关调用它时,它会在响应中阻塞:
2018-09-13 18:37:37,890 [-] [PassThroughMessageProcessor-36] ERROR JsonUtil #writeAsJson. Could not convert OMElement to JSON. Invalid XML payload. Error>>> Unexpected character '~' (code 126) excepted space, or '>' or "/>"
at [row,col {unknown-source}]: [1,4956]
2018-09-13 18:37:37,891 [-] [PassThroughMessageProcessor-36] ERROR PassThroughHttpSSLSender Failed to submit the response
org.apache.axis2.AxisFault: Could not convert OMElement to JSON. Invalid XML payload.
at org.apache.synapse.commons.json.JsonUtil.writeAsJson(JsonUtil.java:372)
at org.apache.synapse.commons.json.JsonFormatter.writeTo(JsonFormatter.java:84)
at org.apache.synapse.transport.passthru.PassThroughHttpSender.submitResponse(PassThroughHttpSender.java:573)
at org.apache.synapse.transport.passthru.PassThroughHttpSender.invoke(PassThroughHttpSender.java:264)
at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:442)
at org.apache.synapse.core.axis2.Axis2Sender.sendBack(Axis2Sender.java:230)
at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.send(Axis2SynapseEnvironment.java:531)
at org.apache.synapse.mediators.builtin.SendMediator.mediate(SendMediator.java:118)
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:338)
at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:90)
at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:56)
at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:304)
at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:554)
at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:188)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:262)
at org.apache.axis2.transport.base.threads.NativeWorkerPool.run(NativeWorkerPool.java:172)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '~' (code 126) excepted space, or '>' or "/>"
at [row,col {unknown-source}]: [1,4956]
at com.ctc.wstx.sr.StreamScanner.throwUnexpectedChar(StreamScanner.java:647)
at com.ctc.wstx.sr.BasicStreamReader.handleNsAttrs(BasicStreamReader.java:2996)
at com.ctc.wstx.sr.BasicStreamReader.handleStartElem(BasicStreamReader.java:2963)
at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2839)
at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1073)
at javax.xml.stream.util.StreamReaderDelegate.next(Unknown Source)
at javax.xml.stream.util.StreamReaderDelegate.next(Unknown Source)
at org.codehaus.stax2.ri.Stax2ReaderAdapter.next(Stax2ReaderAdapter.java:129)
at org.codehaus.stax2.ri.Stax2EventReaderImpl.peek(Stax2EventReaderImpl.java:367)
at org.apache.synapse.commons.staxon.core.event.SimpleXMLEventWriter.add(SimpleXMLEventWriter.java:118)
at org.apache.synapse.commons.json.JsonUtil.writeAsJson(JsonUtil.java:368)
... 23 more
2018-09-13 18:37:37,892 [-] [PassThroughMessageProcessor-36] ERROR Axis2Sender Access-Control-Allow-Headers:authorization,Access-Control-Allow-Origin,Content-Type,SOAPAction,Access-Control-Allow-Methods:HEAD,DELETE,POST,PATCH,PUT,GET,Access-Control-Allow-Origin:*,Content-Type:application/json;charset=utf-8,<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><jsonObject>
(然后继续并包含 XML,它尝试使用 JSON 中的 "P~A"
键作为 <P~A>
XML 标签,这就是它窒息了)
API 定义不 启用了消息中介并且禁用了响应缓存。所以,我不清楚为什么它甚至使用调解器并试图将我的 JSON 响应完全转换为 XML。
所以,问题是:如何让它发挥作用?通过配置它来应对将其转换为 XML 还是不需要?
我还要注意到这个过程中的某些事情需要很长时间。我花了很长时间才收到(错误)响应,但我看到响应数据很快到达 API 管理器。
我们也有 WSO2 分析服务 运行。我试着阻止它以防它导致问题。没有帮助
我将此作为答案发布,因为它可以解决问题。添加
synapse.commons.json.buildValidNCNames=true
到 repository/conf/synapse.properties
文件。
它使用字符代码处理 ~
(以及标签中任何其他无效的内容)。
我想也许中介不是消息中介(已禁用),而是更内部的东西。在那种情况下,我真的不明白为什么上面的设置不是默认值——我没有看到它的缺点,没有它,网关无法处理某些 JSON!