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
- Was ist ein JSON-Format?
- Online Formatter: https://www.jsonformatter.io/
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
counthat den Wert149290,nameden WertFelix, usw.
- API anschauen: https://api.genderize.io/?name=Felix
- Wie lesen wir das aus?
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!";
}
}