WSO2 ESB:WSO2 REST API 调用中的 XML 响应未解析

2024-03-11

我在 WSO2 ESB (4.8.1) 代理服务中处理来自 REST API 的纯 XML 响应时遇到问题。我的 outSequence 显然期望 API 调用结果有效负载是 SOAP 消息,但事实并非如此(纯 XML),从而在进一步处理它时导致错误。我使用 HTTP 端点,但使用地址端点时出现相同的错误。我必须使用 GET 作为请求方法,因为 API 不允许 POX。 (这个问题似乎与已经提到的问题类似WSO2 ESB:记录来自 RDF REST 服务的响应并将其转换回 SOAP https://stackoverflow.com/questions/15010453/wso2-esb-log-and-convert-response-from-the-rdf-rest-service-back-to-soap但是它似乎没有在 ESB 4.8.1 中得到修复,我无法使用那里提到的解决方法)

这是我的终点:

<endpoint xmlns="http://ws.apache.org/ns/synapse" name="Alfresco_login">
   <http uri-template="http://localhost:8080/alfresco/service/api/login?u={query.param.name}&pw={query.param.password}" method="get"></http>
</endpoint>

这是代理:

<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="Alfresco_proxy"
       transports="https,http">
   <target endpoint="Alfresco_login">
      <inSequence>
         <property name="query.param.name" value="XXX"/>
         <property name="query.param.password" value="XXX"/>
      </inSequence>
      <outSequence>
         <log/>
         <send/>
      </outSequence>`enter code here`
   </target>
   <description/>
</proxy>

这是我从 API 得到的响应:

<?xml version="1.0" encoding="UTF-8"?>
<ticket>TICKET_605cbf0977db895db9bbc6e5eb6d4dba75454cc4</ticket>

这是我尝试记录响应时遇到的错误:

ERROR_EXCEPTION : org.apache.synapse.SynapseException: Error while building message
ERROR_DETAIL : org.apache.synapse.SynapseException: Error while building message at org.apache.synapse.mediators.AbstractMediator.handleException(AbstractMediator.java:313) at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:70) at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:47) at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:131) at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:268) at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:488) at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:170) at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180) at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:225) at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) Caused by: org.apache.axis2.AxisFault: Error while building Passthrough stream at org.apache.synapse.transport.passthru.util.RelayUtils.handleException(RelayUtils.java:236) at org.apache.synapse.transport.passthru.util.RelayUtils.builldMessage(RelayUtils.java:111) at org.apache.synapse.transport.passthru.util.RelayUtils.buildMessage(RelayUtils.java:82) at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:68) ... 11 more Caused by: org.apache.axiom.soap.SOAPProcessingException: First Element must contain the local name, Envelope , but found ticket at org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder.constructNode(StAXSOAPModelBuilder.java:305) at org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder.createOMElement(StAXSOAPModelBuilder.java:252) at org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder.createNextOMElement(StAXSOAPModelBuilder.java:234) at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:249) at org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder.getSOAPEnvelope(StAXSOAPModelBuilder.java:204) at org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder.<init>(StAXSOAPModelBuilder.java:154) at org.apache.axiom.om.impl.AbstractOMMetaFactory.createStAXSOAPModelBuilder(AbstractOMMetaFactory.java:73) at org.apache.axiom.om.impl.AbstractOMMetaFactory.createSOAPModelBuilder(AbstractOMMetaFactory.java:79) at org.apache.axiom.om.OMXMLBuilderFactory.createSOAPModelBuilder(OMXMLBuilderFactory.java:196) at org.apache.axis2.builder.SOAPBuilder.processDocument(SOAPBuilder.java:55) at org.apache.synapse.transport.passthru.util.DeferredMessageBuilder.getDocument(DeferredMessageBuilder.java:118) at org.apache.synapse.transport.passthru.util.RelayUtils.builldMessage(RelayUtils.java:107) ... 13 more

这里有人找到解决这个问题的方法吗?


最终,主要问题出现在正确的 MessageBuilder 配置中。只要服务响应是一个简单的 XML,并且在响应标头中进行了标记,WSO2 就可以将其传递给客户端。一旦响应被标记为不同 - 在我的例子中它是 application/atom+xml,默认的 MessageBuilder 没有应用,因此 WSO2 期望内容是 SOAP。我将构建器配置添加到 \repository\conf\axis2\axis2.xml:

<messageBuilder class="org.apache.axis2.builder.ApplicationXMLBuilder" contentType="application/atom+xml"/>

现在工作正常。

See https://docs.wso2.com/display/ESB480/Working+with+Message+Builders+and+Formatters https://docs.wso2.com/display/ESB480/Working+with+Message+Builders+and+Formatters and https://docs.wso2.com/display/ESB402/Message+Relay+Building+Blocks https://docs.wso2.com/display/ESB402/Message+Relay+Building+Blocks

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WSO2 ESB:WSO2 REST API 调用中的 XML 响应未解析 的相关文章

随机推荐