如何自定义从api管理器到简单JSON消息的错误XML响应?

时间:2016-03-02 06:06:04

标签: wso2 wso2-am

当使用无效访问令牌调用已发布的API时,获得了XML响应。                  900901        无效证件        API访问失败:/sit/zxq/oapi/ut/1.0,版本:1.0,密钥:b645348f2ca7fea5a9cf498e4085a471。确保您已经提供了正确的访问令牌     

我们如何根据以下JSON格式自定义此类响应? {     “req_id”:“REQ_ENT_1356985018299_9678”,     “err_resp”:{         “code”:“28001”,         “msg”:“无效的访问令牌”     } }

感谢并期待您的专业知识。

2 个答案:

答案 0 :(得分:0)

我们最近在API Manager实施方面做了类似的事情。您可以在/ repository / deployment / server / synapise-configs / default / sequences中找到故障序列,匹配错误代码,并提供您自己的JSON内容。您还可以使用switch中介(故障序列只是中介序列)来为各种Accept头值返回正确的内容类型。只需将fault.xml文件中写入的有效负载替换为等效的JSON内容(或按照建议,编写一个开关以支持这两种内容类型)。

答案 1 :(得分:0)

您需要定位https://docs.wso2.com/display/AM260/Error+Handling中的错误代码,并将其更新为自定义JSON消息。对于与身份验证令牌相关的错误,请尝试按以下方法修改_auth_failure_handler _:

<sequence name="_auth_failure_handler_" xmlns="http://ws.apache.org/ns/synapse">
<property name="error_message_type" value="application/json"/>
<filter source="get-property('ERROR_CODE')" regex="405">
  <then>
      <sequence key="converter"/>
      <drop/>
  </then>
  <else>
  </else>
</filter>
<filter source="get-property('ERROR_CODE')" regex="900901">
    <then>
        <sequence key="invalidCredential"/>
        <drop/>
    </then>
    <else>
    </else>
</filter>
<filter source="get-property('ERROR_CODE')" regex="900902">
    <then>
        <sequence key="missingCredential"/>
        <drop/>
    </then>
    <else>
    </else>
</filter>
<sequence key="_cors_request_handler_"/>

对于您的情况,Invalid Credential具有900901代码,因此它将匹配并需要定义invalidCredential.xml,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="invalidCredential">
    <payloadFactory media-type="json">
        <format>{ "req_id": "REQ_ENT_1356985018299_9678", "err_resp": { "code": "28001", "msg": "Invalid access token" } </format>
    <!--Add your custom message and format here. This will be your output-->
    </payloadFactory>
    <property name="RESPONSE" value="true"/>
    <header name="To" action="remove"/>
    <property name="HTTP_SC" value="401" scope="axis2"/>
    <property name="messageType" value="application/json" scope="axis2"/>
    <send/>
</sequence>