Ï Guerilla-Coding :: API Session II

API Session II

Architekturen & Microservices vs Monolith

  • Eine API = Ein Service

Microservice vs Monolith:

Monolith Architektur

  • Ein großer Service mit allen Funktionen

Pro:

  • Schnellere Entwicklung, da weniger Services hochgezogen werden müssen
  • Infrastruktur (d.h. auf welchem Server läuft der Code, unter welcher Adresse ist die API erreichbar, etc.) einfacher darzustellen

Contra:

  • Hoher Wartungsaufwand, da unübersichtlich
  • (Siehe Pros bei Microservices)

Microservice Architektur

  • Viele kleine Services
  • Kommunizieren untereinander

Pro:

  • Robuster -> Fehlerrisiken verteilt auf verschiedene Quellen > - Fällt ein Service aus, ist nicht direkt alles kaputt
  • Leichter zu entwickeln > - “Divide and conquer” -> Aufteilen der fachlichen Logiken führt zu schlankerem Code
    • Bessere Wartbarkeit
  • Programmiersprachen mischbar -> “Choose the best tool for the job!”
  • Leichtere Integration von Drittanbieter-Services

Contra:

  • Mehr Kommunikationsaufwand unter den Services
  • Modernerer Ansatz: Microservices

Machine2Machine Communication

  • Wir machen uns nun Services, die bereits existieren für unsere API zunutze
  • Bereits existierend: Chuck-Norris API (https://chucknorris.learneria.de/randomJoke)
    • Spuckt einen zufälligen Chuck Norris Witz aus
    • Browser öffnen
    • URL aufrufen, Verhalten feststellen
  • Ablauf: Client called unsere API -> Unsere API called Chuck Norris -> Chuck Norris antwortet API -> API antwortet Client
  • D.h. unsere API braucht etwas, das wie der Browser als Client funktioniert
    • TADAAAAA (RestTemplate)
RestTemplate browser = new RestTemplate();
ResponseEntity response = browser.getForEntity("https://chucknorris.learneria.de/randomJoke", String.class);
String chuckNorrisJoke = response.getBody().toString();
  • Neuer Endpunkt
  • Chuck Norris API aufrufen (siehe oben)
  • Response ergänzen um etwas eigenes, Joke ausgeben

Personalized API

  • Chuck Norris Witze sind langweilig -> Wir wollen Christina (und Melanie und Felix) Witze!
  • Copy Pasta
  • Parameter hinzufügen -> Name
  • Immer in der Response von Chuck Norris den Namen ersetzen
    @RequestMapping(path = "/personalizedJoke")
    String personalizedJoke(@RequestParam(name = "name") String name) {

        RestTemplate browser = new RestTemplate();
        ResponseEntity response = browser.getForEntity("https://chucknorris.learneria.de/randomJoke", String.class);
        String chuckNorrisJoke = response.getBody().toString();

        return chuckNorrisJoke.replace("Chuck Norris", name);
    }

(Optional) Gender-API

JSON

= JavaScript Object Notation

  • Ein gängiges Format zum Austausch von Daten über verschiedene Services hinweg (Beispiel: Genderize API)
  • Wie ein Baum geschachtelt
{
  "count": 159290,
  "name": "Felix",
  "gender": "male",
  "probability": 1
}
  • Immer eine Zuordnung von sogenannten Key-Value-Paaren (Schlüssel-Wert-Paare)
  • Beispiel oben: Der Schlüssel count hat den Wert 149290, name den Wert Felix, usw.
RestTemplate browser = new RestTemplate();
ResponseEntity response = browser.getForEntity("https://api.genderize.io?name=" + name, String.class);
String body = response.getBody().toString();
ObjectMapper formatter = new ObjectMapper();
JsonNode baum = formatter.readTree(body);

String gender = baum.get("gender").asText();
  • Neuer Endpunkt mit Name als Parameter
    @RequestMapping(path = "/bestPerson")
    String bestPerson(@RequestParam(name = "Name") String name) throws JsonProcessingException {

        // https://genderize.io/

        RestTemplate browser = new RestTemplate();
        ResponseEntity response = browser.getForEntity("https://api.genderize.io?name=" + name, String.class);
        System.out.println(response);
        String body = response.getBody().toString();
        System.out.println(body);
        ObjectMapper formatter = new ObjectMapper();
        JsonNode baum = formatter.readTree(body);

        String gender = baum.get("gender").asText();

        if (gender.equals("male")) {
            return name + " ist der Beste!";
        }
        if (gender.equals("female")) {
            return name + " ist die Beste!";
        } else {
            return name + " ist am besten!";
        }
    }