Monday, March 27, 2017

How to write custom WSO2 synapse handler to validate the payload and response to the client?

In this article I'm going to cover below areas

  1. How to write a Synapse handler
  2. How to get the request payload
  3. How to validate payload (In this example, I'm checking whether the payload is a valid JSON or not)
  4. Respond to the customer without invoking the mediation flow.
Implement the handler class with extending the AbstractSynapseHandler class as below

package com.wso2.handler.sample;

import net.minidev.json.parser.JSONParser;
import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.AbstractSynapseHandler;
import org.apache.synapse.MessageContext;
import org.apache.synapse.core.axis2.Axis2MessageContext;
import org.apache.synapse.core.axis2.Axis2Sender;
import org.apache.synapse.transport.passthru.util.RelayUtils;

import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.Map;

/**
 * Created by tharanga
 */
public class SampleMessageHandler extends AbstractSynapseHandler {

    private static final Log log = LogFactory.getLog(SampleMessageHandler.class);

    public boolean handleRequestInFlow(MessageContext messageContext) {
        try {

            org.apache.axis2.context.MessageContext axis2MessageContext = ((Axis2MessageContext) messageContext)
                    .getAxis2MessageContext();
            Object headers = axis2MessageContext
                    .getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);

            RelayUtils.buildMessage(((Axis2MessageContext) messageContext).getAxis2MessageContext());

            InputStream jsonPaylodStream = (InputStream) ((Axis2MessageContext) messageContext)
                    .getAxis2MessageContext().getProperty(
                            "org.apache.synapse.commons.json.JsonInputStream");
            StringWriter writer = new StringWriter();

            IOUtils.copy(jsonPaylodStream, writer);

            String payloadMessge = writer.toString();

            try {
                //Validate the json message.
                JSONParser jsonParser = new JSONParser();
                jsonParser.parse(payloadMessge);

                System.out.println(messageContext.getEnvelope().getBody().toString());

                
                return true;
            } catch (Exception ex) {
                Map headersMap = (Map) headers;
                headersMap.clear();
                axis2MessageContext.setProperty("HTTP_SC", "400");
                messageContext.setProperty("RESPONSE", "true");
                messageContext.setTo(null);

                Axis2Sender.sendBack(messageContext);

                return false;
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return false;
    }

    public boolean handleRequestOutFlow(MessageContext messageContext) {
        return true;
    }

    public boolean handleResponseInFlow(MessageContext messageContext) {
        return true;
    }

    public boolean handleResponseOutFlow(MessageContext messageContext) {
        return true;
    }
}

In the above sample, I'm validating the JSON message and if it fails, send the 400 HTTP response code to the client.

Find the sample test result below

  • Payload with valid JSON message
[2017-03-23 22:13:55,933] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "POST /services/Proxy1 HTTP/1.1[\r][\n]"
[2017-03-23 22:13:55,952] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "Host: tharanga:8280[\r][\n]"
[2017-03-23 22:13:55,952] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "Connection: keep-alive[\r][\n]"
[2017-03-23 22:13:55,952] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "Content-Length: 19[\r][\n]"
[2017-03-23 22:13:55,952] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "Postman-Token: 29dfad86-fa3e-5576-4bfd-25f503687baa[\r][\n]"
[2017-03-23 22:13:55,952] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "Cache-Control: no-cache[\r][\n]"
[2017-03-23 22:13:55,952] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "Origin: chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop[\r][\n]"
[2017-03-23 22:13:55,956] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36[\r][\n]"
[2017-03-23 22:13:55,956] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "Content-Type: application/json[\r][\n]"
[2017-03-23 22:13:55,956] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "Accept: */*[\r][\n]"
[2017-03-23 22:13:55,956] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "Accept-Encoding: gzip, deflate[\r][\n]"
[2017-03-23 22:13:55,956] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "Accept-Language: en-US,en;q=0.8[\r][\n]"
[2017-03-23 22:13:55,957] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "[\r][\n]"
[2017-03-23 22:13:55,957] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "{"name":"tharanga"}"
tharanga
[2017-03-23 22:13:56,239]  INFO - LogMediator status = 11111111111111111111111111111111111111111111
[2017-03-23 22:13:56,250] DEBUG - wire HTTP-Listener I/O dispatcher-1 << "HTTP/1.1 202 Accepted[\r][\n]"
[2017-03-23 22:13:56,251] DEBUG - wire HTTP-Listener I/O dispatcher-1 << "Date: Thu, 23 Mar 2017 16:43:56 GMT[\r][\n]"
[2017-03-23 22:13:56,251] DEBUG - wire HTTP-Listener I/O dispatcher-1 << "Transfer-Encoding: chunked[\r][\n]"
[2017-03-23 22:13:56,251] DEBUG - wire HTTP-Listener I/O dispatcher-1 << "Connection: keep-alive[\r][\n]"
[2017-03-23 22:13:56,251] DEBUG - wire HTTP-Listener I/O dispatcher-1 << "[\r][\n]"
[2017-03-23 22:13:56,252] DEBUG - wire HTTP-Listener I/O dispatcher-1 << "0[\r][\n]"
[2017-03-23 22:13:56,252] DEBUG - wire HTTP-Listener I/O dispatcher-1 << "[\r][\n]"
  • Payload with invalid JSON message
[2017-03-23 22:14:10,283] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "POST /services/Proxy1 HTTP/1.1[\r][\n]"
[2017-03-23 22:14:10,283] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "Host: tharanga:8280[\r][\n]"
[2017-03-23 22:14:10,283] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "Connection: keep-alive[\r][\n]"
[2017-03-23 22:14:10,283] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "Content-Length: 17[\r][\n]"
[2017-03-23 22:14:10,284] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "Postman-Token: 194a9cd8-35ed-3998-08b7-fb94598797a3[\r][\n]"
[2017-03-23 22:14:10,284] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "Cache-Control: no-cache[\r][\n]"
[2017-03-23 22:14:10,284] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "Origin: chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop[\r][\n]"
[2017-03-23 22:14:10,284] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36[\r][\n]"
[2017-03-23 22:14:10,284] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "Content-Type: application/json[\r][\n]"
[2017-03-23 22:14:10,284] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "Accept: */*[\r][\n]"
[2017-03-23 22:14:10,284] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "Accept-Encoding: gzip, deflate[\r][\n]"
[2017-03-23 22:14:10,284] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "Accept-Language: en-US,en;q=0.8[\r][\n]"
[2017-03-23 22:14:10,285] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "[\r][\n]"
[2017-03-23 22:14:10,285] DEBUG - wire HTTP-Listener I/O dispatcher-1 >> "{"name":"tharanga"
[2017-03-23 22:14:10,419] DEBUG - wire HTTP-Listener I/O dispatcher-1 << "HTTP/1.1 400 Bad Request[\r][\n]"
[2017-03-23 22:14:10,420] DEBUG - wire HTTP-Listener I/O dispatcher-1 << "Content-Type: application/json; charset=UTF-8[\r][\n]"
[2017-03-23 22:14:10,420] DEBUG - wire HTTP-Listener I/O dispatcher-1 << "Date: Thu, 23 Mar 2017 16:44:10 GMT[\r][\n]"
[2017-03-23 22:14:10,420] DEBUG - wire HTTP-Listener I/O dispatcher-1 << "Transfer-Encoding: chunked[\r][\n]"
[2017-03-23 22:14:10,420] DEBUG - wire HTTP-Listener I/O dispatcher-1 << "Connection: Close[\r][\n]"
[2017-03-23 22:14:10,420] DEBUG - wire HTTP-Listener I/O dispatcher-1 << "[\r][\n]"
[2017-03-23 22:14:10,421] DEBUG - wire HTTP-Listener I/O dispatcher-1 << "11[\r][\n]"
[2017-03-23 22:14:10,421] DEBUG - wire HTTP-Listener I/O dispatcher-1 << "{"name":"tharanga[\r][\n]"
[2017-03-23 22:14:10,421] DEBUG - wire HTTP-Listener I/O dispatcher-1 << "0[\r][\n]"
[2017-03-23 22:14:10,421] DEBUG - wire HTTP-Listener I/O dispatcher-1 << "[\r][\n]"

1 comment:


  1. I am so inspired by this post. We also Help to secure no credit loan and to help poor to quick public awareness. Please check http://atlasloanfirm.blogspot.com/ Whatsapp +14433459339 for some beautiful stuffs and encourage .

    ReplyDelete