WSO2 API管理器-如何从InSequence向客户端发送错误/故障消息

WSO2 API管理器-如何从InSequence向客户端发送错误/故障消息,wso2,wso2esb,wso2-am,Wso2,Wso2esb,Wso2 Am,我已经使用WSO2 API管理器(StockQuoteService)创建了一个REST API,并配置了一个基于SOAP的后端web服务(将REST转换为SOAP),它将从中基于URL模板获取数据 在“In Sequence”中,我使用了一个交换机中介器根据传入的数据将请求发送到不同的后端端点,而在默认情况下(当没有大小写匹配时),我希望将错误消息发送回客户端,即“输入消息无效” 我尝试过使用发送中介、响应中介、序列中介,但仍然没有成功(可能是做错了什么),因为当我尝试调用URL时,仍然会出现

我已经使用WSO2 API管理器(StockQuoteService)创建了一个REST API,并配置了一个基于SOAP的后端web服务(将REST转换为SOAP),它将从中基于URL模板获取数据

在“In Sequence”中,我使用了一个交换机中介器根据传入的数据将请求发送到不同的后端端点,而在默认情况下(当没有大小写匹配时),我希望将错误消息发送回客户端,即“输入消息无效”

我尝试过使用发送中介、响应中介、序列中介,但仍然没有成功(可能是做错了什么),因为当我尝试调用URL时,仍然会出现“服务器无响应”错误,该URL与任何切换情况都不匹配,并变为默认值

如何按照WSO2 API Manager的顺序将错误/故障消息从发送回客户端?

这应该可以工作

<payloadFactory media-type="json">
      <format>
          {
            "error":"true",
            "message":"error case"
          }
      </format>  
</payloadFactory>
<property name="messageType" value="application/json" scope="axis2"/>
<respond/>

{
“错误”:“正确”,
“消息”:“错误案例”
}

在我的场景中,我使用开关中介并调用一个或另一个操作的输入序列,在默认选项中,我创建失败响应

  <inSequence>
     <switch xmlns:xsd="http://pharmacy.arce.org/xsd"
             description=""
             source="//xsd:desc">
        <case regex="NATURAL">
           <log description="Search Pharmacy" level="custom" separator=",">
              <property name="STATUS" value="Search Pharmacy"/>
           </log>
           <payloadFactory media-type="xml">
              <format>
                 <p:searchpharmacy xmlns:p="http://pharmacy.arce.org">
                    <ax22:pharmacy xmlns:ax22="http://pharmacy.arce.org">
                       <xs:desc xmlns:xs="http://pharmacy.arce.org/xsd">$1</xs:desc>
                       <xs:id xmlns:xs="http://pharmacy.arce.org/xsd">$2</xs:id>
                       <xs:latitude xmlns:xs="http://pharmacy.arce.org/xsd">$3</xs:latitude>
                       <xs:longitude xmlns:xs="http://pharmacy.arce.org/xsd">$4</xs:longitude>
                    </ax22:pharmacy>
                 </p:searchpharmacy>
              </format>
              <args>
                 <arg evaluator="xml" expression="//xsd:desc"/>
                 <arg evaluator="xml" expression="//xsd:id"/>
                 <arg evaluator="xml" expression="//xsd:latitude"/>
                 <arg evaluator="xml" expression="//xsd:longitude"/>
              </args>
           </payloadFactory>
           <header name="To" scope="default" value="urn:searchpharmacy"/>
           <log level="full" separator=",">
              <property name="Mensaje" value="Cuerpo"/>
           </log>
        </case>
        <case regex="EXPERIMENTAL">
           <log description="Search Pharmacy Direction" level="custom" separator=",">
              <property name="STATUS" value="Search Pharmacy Direction Request"/>
           </log>
           <payloadFactory media-type="xml">
              <format>
                 <p:searchPhone xmlns:p="http://pharmacy.arce.org">
                    <ax22:pharmacy xmlns:ax22="http://pharmacy.arce.org">
                       <xs:desc xmlns:xs="http://pharmacy.arce.org/xsd">$1</xs:desc>
                       <xs:id xmlns:xs="http://pharmacy.arce.org/xsd">$2</xs:id>
                       <xs:latitude xmlns:xs="http://pharmacy.arce.org/xsd">$3</xs:latitude>
                       <xs:longitude xmlns:xs="http://pharmacy.arce.org/xsd">$4</xs:longitude>
                    </ax22:pharmacy>
                 </p:searchPhone>
              </format>
              <args>
                 <arg evaluator="xml" expression="//xsd:desc"/>
                 <arg evaluator="xml" expression="//xsd:id"/>
                 <arg evaluator="xml" expression="//xsd:latitude"/>
                 <arg evaluator="xml" expression="//xsd:longitude"/>
              </args>
           </payloadFactory>
           <header name="Action" scope="default" value="urn:searchPhone"/>
           <property name="SOAPAction" scope="transport" type="STRING" value=""/>
           <log level="full" separator=",">
              <property name="Data" value="Body"/>
           </log>
        </case>
        <default>
           <log description="Fault" level="custom" separator=",">
              <property name="STATUS" value="Invoke fault "/>
           </log>
           <payloadFactory media-type="xml">
              <format>
                 <rs:fault xmlns:rs="http://pharmacy.arce.org">
                    <rs:code>-1</rs:code>
                    <rs:type>Invocation error</rs:type>
                    <rs:message>No operation has been invoked</rs:message>
                    <rs:description>The value of the input parameter is not valid</rs:description>
                 </rs:fault>
              </format>
              <args/>
           </payloadFactory>
           <respond/>
        </default>
     </switch>
  </inSequence>
您可以在这里找到其他场景

Nits 错误响应为注释“no response from server”,我在从具有api管理器的测试控制台调用api时收到它

你可以看到这个链接

验证您期望的响应

尝试从另一个工具(如soapui或Postman)调用,在我的例子中,我会收到一条定义了结构的故障响应消息

这是来自控制台API的调用

curl -X GET --header 'Accept: application/xml' --header 'Authorization: Bearer 465f1385-a120-3c19-ad22-c3057e744a3b' 'https://169.254.193.10:8252/getById/1.0.0/getEmployeeXML?Id=5'
对于标头中来自另一个客户端的调用,传递api调用中的这些值

Accept: application/json
Authorization: Bearer 465f1385-a120-3c19-ad22-c3057e744a3b'

嗨,阿尔伯,谢谢你的回复。实际上,当我按照您在Switch的Default部分中指定的方式配置它时,它仍在尝试调用后端URL。使用WSO2 ESB,它可以按预期工作,但是使用WSO2 API管理器,它仍然尝试访问后端url,并始终给出“错误无响应”消息。非常感谢您的回复。实际上我尝试了这个,但是它没有指定它必须调用错误序列的任何地方,所以在运行这个之后,它仍然尝试调用后端URL(基于SOAP的Web服务)。在默认情况下,我们是否可能配置一条错误消息或调用一个错误序列来阻止它调用后端url,并将配置好的错误消息显示回用户。
curl -X GET --header 'Accept: application/xml' --header 'Authorization: Bearer 465f1385-a120-3c19-ad22-c3057e744a3b' 'https://169.254.193.10:8252/getById/1.0.0/getEmployeeXML?Id=5'
Accept: application/json
Authorization: Bearer 465f1385-a120-3c19-ad22-c3057e744a3b'