Overview
You can add custom error messages for an API by following the post [1] but when the error is thrown inside the custom in or out sequence we add as the mediation extension this custom error sequence which we specify for the API does not get invoked. Therefore we need to specify the error sequence seperately for the custom sequence. This blog will explain how to carry out this use case.
Let's get started
To demonstrate this I will be using the call mediator inside the custom sequence. Since when an invalid endpoint is invoked with the call mediator it would generate an error in the API Manager which would be received inside our custom sequence.
1) You can follow my previous tutorial [2] to get a better understanding and configurations needed to use the call mediator using wso2 api manager 1.10.0. Create the API as mentioned in the sequence above and subscribe and generate keys for the API in the store.
2) Now what we are going to do is, we are going to provide an invalid capital city. When the call mediator executes this since this is invalid and not found it would generate an error reponse in the swagger UI. This would execute the API Manager's default fault sequence.
3) Now since we need to change this default error code to display something more meaningful we need to create a custom error sequence. You can create a custom error sequence as instructed in the tutorial [1]. Below is the custom error sequence which I have used, you can download it from HERE.
<sequence xmlns="http://ws.apache.org/ns/synapse" name="customErrorSequence">
<payloadFactory>
<format>
<CapitalResponse>
<message>No result for the given capital: $1</message>
</CapitalResponse>
</format>
<args>
<arg expression="get-property('uri.var.capital')"/>
</args>
</payloadFactory>
<class name="org.wso2.carbon.apimgt.usage.publisher.APIMgtFaultHandler"/>
<property name="RESPONSE" value="true"/>
<property name="HTTP_SC" value="200" scope="axis2"/>
<header name="To" action="remove"/>
<property name="NO_ENTITY_BODY" scope="axis2" action="remove"/>
<property name="ContentType" scope="axis2" action="remove"/>
<property name="Authorization" scope="transport" action="remove"/>
<property name="Host" scope="transport" action="remove"/>
<property name="Accept" scope="transport" action="remove"/>
<property name="X-JWT-Assertion" scope="transport" action="remove"/>
<sequence key="_cors_request_handler_"/>
<send/>
</sequence>
4) We need to then add this sequence it from the management console using the source view. Or you can add the sequence .xml file to the location APIM_HOME/repository/deployment/server/synapse-configs/default/sequences. After adding this change you may have to wait for 15 mins for changes to get reflected or else you can restart the API Manager.
5) Nest we need to edit the in sequence we used previously to point to this fault sequence when a fault occurs withing the in sequence. For that we need to modify the <sequence> tag to mentioned which is the sequence to be executed when an error occurs. The modified call mediator sequence is as follows and you can download it from HERE .
<sequence xmlns="http://ws.apache.org/ns/synapse" name="callMediatorSampleSequence" onError="customErrorSequence">
<property name="uri.var.capital" expression="$url:capital"/>
<property name="REST_URL_POSTFIX" scope="axis2" action="remove"/>
<call blocking="true">
<endpoint>
<http method="get" uri-template="http://restcountries.eu/rest/v1/capital/{uri.var.capital}"/>
</endpoint>
</call>
<log level = "custom">
<property name = "Sequence name" value="In the call mediator sequence"/>
<property name = "Capital name" expression="get-property('uri.var.capital')"/>
<property name="JSONPayload" expression="json-eval($.)"/>
</log>
</sequence>
6) Next we need to add the above modifed sequence to our API and re publish the API.
7) Now when we invoke the API with an invalid value for the call mediator we will be able to see our custom error message.
Refernces
Comments
Post a Comment