menu
{$Head.Title}}

Generic REST Endpoint mit Spring Boot

Generic REST Endpoint mit Spring Boot

Spring Boot

Die Programmierung von REST Services mit Spring Boot ist gemäss Lehrbuch eine relativ einfache Sache.Jede Klasse kann als Rest Service funktionieren und Daten im Format JSON verarbeiten.

In der Regel nimmt im Lauf der Entwicklung die Anzahl REST Services zu und damit auch die Komplexität und Redundanz. So fehlt ein zentrales Error Handling oder ein Überwachungspunkt (Single Rest Endpoint).

Ein Single Rest Endpoint arbeitet wie ein Portier, alle Zu- und Abgänge werden über einen Punkt abgewickelt. Er zwingt uns ein Protokoll für die Kommunikation zu definieren und damit die Rest Endpoints zu standardisieren.

Genau hier hilft das Konzept des generischen Standalone Rest Endpoints. Die Klasse GenericRestService zeigt anhand der Methode Get den Servlet Endpoint. Dieser Call behandelt allfällige Exceptions und leitet den Call an die Methode executeGet weiter.

package ch.std.service.generic;
import javax.servlet.http.HttpServletRequest;

import org.json.JSONObject;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/rest/generic", produces = MediaType.APPLICATION_JSON_VALUE)
public class GenericRestService {

   public GenericRestService() {
   }

   @RequestMapping(method = RequestMethod.GET)
   public Object get(HttpServletRequest httpServletRequest) {
      try {
         JSONObject jsonResponse = executeGet(httpServletRequest);
         return jsonResponse;
      } catch(Exception e) {
         JSONObject jsonObject = new JSONObject();
         try {
            jsonObject.put("status", "failure");
         } catch (Exception ee) {
         }
         return jsonObject;
      }
   }

   public JSONObject executeGet(HttpServletRequest httpServletRequest) {
      throw new UnsupportedOperationException();
   }
}

Der effektive Endpoint wird über die Subklasse z.B. EchoRestService implementiert:


package ch.std.service.echo;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.json.JSONObject;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import ch.std.service.generic.GenericRestService;

@RestController
@RequestMapping(value = "/rest/echo", produces = MediaType.APPLICATION_JSON_VALUE)
public class EchoRestService extends GenericRestService {

   public EchoRestService() {
   }

   public JSONObject executeGet(HttpServletRequest httpServletRequest) {
         Map parameterMap = httpServletRequest.getParameterMap();
         JSONObject response = new JSONObject(parameterMap);
         return response;
    }
}

Die restlichen HTTP Methoden POST, PUT und DELETE sind nun einfach integrierbar. Die Klasse HttpServletRequest kann nach Belieben selber gekapselt werden.

Feedback

War dieser Blog für Sie wertvoll. Wir danken für jede Anregung und Feedback