【问题标题】:WSO2 API manager - How to send Error/Fault message back to the Client from InSequenceWSO2 API 管理器 - 如何从 InSequence 将错误/故障消息发送回客户端
【发布时间】:2017-02-01 01:10:00
【问题描述】:

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

在“按顺序”中,我使用 Switch 调解器根据传入数据将请求发送到不同的后端端点,而在默认情况下(当没有大小写匹配时),我想将错误消息发送回“输入消息无效”的客户端。

我尝试使用发送中介、响应中介、序列中介,但仍然没有成功(可能做错了什么),因为当我尝试调用没有响应的 URL 时,我仍然收到“服务器没有响应”错误匹配任何大小写的 Switch 并转到默认值。

如何从 WSO2 API 管理器的序列中将错误/故障消息发送回客户端?

【问题讨论】:

    标签: wso2 wso2esb wso2-am


    【解决方案1】:

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

      <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>
    

    这是默认部分

    <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>
    

    以及故障响应

      {"fault":{"code":-1,"type":"Invocation error","message":"No operation has been invoked","description":"The value of the input parameter is not valid"}}
    

    你可以在这里找到其他场景

    http://harshcreationz.blogspot.com/2016/02/common-and-error-handling-sequences.html

    【讨论】:

    • 嗨,阿尔伯,感谢您的回复。实际上,当我按照您在 Switch 的默认部分中指定的方式进行配置时,它仍在尝试调用后端 URL。使用 WSO2 ESB,它可以按预期工作,但是使用 WSO2 API Manager,它仍然会尝试访问后端 url,并且总是给出“No response from error”消息。
    【解决方案2】:

    这应该可以。

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

    【讨论】:

    • 非常感谢您的回复。实际上我试过这个,但它没有指定它必须调用故障序列的任何地方,所以在运行它之后,它仍然尝试调用后端 URL(基于 SOAP 的 Web 服务)。是否有可能在默认情况下,我们配置错误消息或调用故障序列,以阻止它调用后端 url,而只是将配置的故障消息显示给用户。
    【解决方案3】:

    尼特 错误响应为 cmets“服务器无响应”,当我从具有 API Manager 的测试控制台调用 api 时收到它。

    你可以看到这个链接 API Console Issue

    验证您期望的响应。

    尝试从其他工具(例如 SOAP UI 或 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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 2015-01-17
      • 2018-03-08
      • 1970-01-01
      • 2017-04-06
      • 2013-06-24
      相关资源
      最近更新 更多