在WSO2中,ESB在进入api之前先验证XML

时间:2018-10-19 05:07:01

标签: xml api wso2 wso2esb xml-validation

是否有一种方法可以验证 XML WSO2 ESB API 中,以便进行验证。

当我的 API 错误的 XML 出现错误。这是我之前要验证的 API 遇到的错误。

  

[2018-10-19 10:00:03,531]错误-LogMediator无法构建完整日志   消息:com.ctc.wstx.exc.WstxParsingException:意外的关闭标记   ;预期的。

发送XML

<Request>
    <DeleteServiceRequest> 
       <ServiceLineId>12344455</ServiceLineId> 

</Request> 

API标头

<?xml version="1.0" encoding="UTF-8"?>
<api context="/test" name="testAPI" xmlns="http://ws.apache.org/ns/synapse">
    <resource methods="POST">
        <inSequence>

1 个答案:

答案 0 :(得分:3)

问题是要验证消息,您需要先构建它。您收到的消息不是格式正确的xml,因此API首次尝试构建消息时,它将失败。但是,还需要验证消息的XML构建,因此xml验证介体也将失败。

因此,当收到的消息不是正确的XML时,您将无法验证XML。 (从技术上讲,它不是XML)。通常,这是当您将错误发送回客户端时。而且由于它们在调用API时会出现技术错误,因此您可以为他们提供所遇到的实际错误,以便他们知道要解决的问题。

您可以使用以下属性获取有关您的错误的信息,然后使用此信息构造故障消息以发送回客户端。例如,以下故障序列将记录错误详细信息,并将简单的错误消息发送回客户端。

      <faultSequence>
         <log level="custom">
            <property name="text" value="An unexpected error occured"/>
            <property expression="get-property('ERROR_MESSAGE')" name="message"/>
            <property expression="get-property('ERROR_DETAIL')" name="detail"/>
            <property expression="get-property('ERROR_CODE')" name="code"/>
            <property expression="get-property('ERROR_DETAIL')" name="detail"/>
         </log>
         <payloadFactory media-type="xml">
            <format>
               <ERROR xmlns="">
                  <MESSAGE>You broke it</MESSAGE>
                  <DETAIL>$1</DETAIL>
               </ERROR>
            </format>
            <args>
               <arg evaluator="xml" expression="get-property('ERROR_MESSAGE')"/>
            </args>
         </payloadFactory>
         <respond/>
      </faultSequence>

您可能还想在返回消息之前将http状态代码设置为适当的值,例如:

<property name="HTTP_SC" value="500" scope="axis2"/>