8 REST APIs

8.1 Einführung

REST (Representational State Transfer) ist ein Architekturstil für verteilte Systeme, insbesondere für webbasierte Anwendungen. REST definiert eine Reihe von Prinzipien und Constraints, die dazu beitragen, skalierbare und flexible Webservices zu erstellen. RESTful APIs nutzen das HTTP-Protokoll, um Daten zwischen Client und Server auszutauschen.

8.2 Grundprinzipien von REST

  1. Client-Server-Architektur

    Die Trennung von Client und Server ermöglicht eine unabhängige Entwicklung und Skalierung beider Komponenten. Der Client ist für die Benutzeroberfläche verantwortlich, während der Server die Daten und Geschäftslogik bereitstellt.

  2. Zustandslosigkeit

    Jede Anfrage vom Client an den Server muss alle Informationen enthalten, die nötig sind, um sie zu verarbeiten. Der Server speichert keine Sitzungsinformationen über den Client. Dies erhöht die Skalierbarkeit und vereinfacht das Design.

  3. Cachebarkeit

    Responses sollten als cachebar oder nicht-cachebar gekennzeichnet werden. Durch das Caching können Clients wiederholte Anfragen vermeiden und die Performance verbessern.

  4. Einheitliche Schnittstelle

    Eine einheitliche Schnittstelle zwischen Client und Server vereinfacht die Interaktion. Dies wird durch die Nutzung standardisierter HTTP-Methoden und -Statuscodes erreicht.

  5. Schichtenarchitektur

    Eine RESTful Architektur kann aus mehreren Schichten bestehen, die unabhängig voneinander funktionieren, z. B. Load Balancer, Sicherheitsproxies oder Gateways.

  6. Code-on-Demand (optional)

    Server können ausführbaren Code an Clients senden, um deren Funktionalität zu erweitern, z. B. durch JavaScript-Snippets. Dies ist optional und nicht immer erforderlich.

8.3 HTTP-Methoden in REST

REST nutzt die vorhandenen HTTP-Methoden, um Operationen auf Ressourcen durchzuführen:

8.4 Aufbau von RESTful APIs

8.4.1 Beispiel einer RESTful API

Angenommen, wir entwickeln eine einfache API zur Verwaltung von Büchern.

8.4.1.1 Endpunkte:

8.4.2 Codebeispiel mit Spring Boot

Erstellen eines einfachen REST-Controllers:

@RestController
@RequestMapping("/api/books")
public class BookController {

    private final Map<Long, Book> bookRepository = new ConcurrentHashMap<>();
    private final AtomicLong idCounter = new AtomicLong();

    @GetMapping
    public Collection<Book> getAllBooks() {
        return bookRepository.values();
    }

    @GetMapping("/{id}")
    public ResponseEntity<Book> getBookById(@PathVariable Long id) {
        Book book = bookRepository.get(id);
        if (book != null) {
            return ResponseEntity.ok(book);
        } else {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
        }
    }

    @PostMapping
    public ResponseEntity<Book> createBook(@RequestBody Book book) {
        Long id = idCounter.incrementAndGet();
        book.setId(id);
        bookRepository.put(id, book);
        return ResponseEntity.status(HttpStatus.CREATED).body(book);
    }

    @PutMapping("/{id}")
    public ResponseEntity<Book> updateBook(@PathVariable Long id, @RequestBody Book book) {
        if (bookRepository.containsKey(id)) {
            book.setId(id);
            bookRepository.put(id, book);
            return ResponseEntity.ok(book);
        } else {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
        }
    }

    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteBook(@PathVariable Long id) {
        if (bookRepository.containsKey(id)) {
            bookRepository.remove(id);
            return ResponseEntity.noContent().build();
        } else {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
        }
    }
}

8.4.3 Erläuterung:

Modellklasse Book:

public class Book {
    private Long id;
    private String title;
    private String author;

    // Getter und Setter
}

8.5 HTTP-Statuscodes und ResponseEntity

8.6 Verwendung von HTTP-Methoden

8.7 Testen der API mit curl

# Alle Bücher abrufen
curl -X GET http://localhost:8080/api/books

# Neues Buch erstellen
curl -X POST -H "Content-Type: application/json" -d '{"title":"Spring Boot","author":"John Doe"}' http://localhost:8080/api/books

# Buch mit ID 1 abrufen
curl -X GET http://localhost:8080/api/books/1

# Buch aktualisieren
curl -X PUT -H "Content-Type: application/json" -d '{"title":"Spring Boot 2","author":"John Doe"}' http://localhost:8080/api/books/1

# Buch löschen
curl -X DELETE http://localhost:8080/api/books/1

8.8 Best Practices für RESTful APIs

8.9 Diagramm: REST API Interaktion

8.10 Vorteile von RESTful APIs

8.11 Herausforderungen

8.12 tl;dr

REST APIs basieren auf HTTP und ermöglichen die Kommunikation zwischen Client und Server durch Nutzung von Standardmethoden und -protokollen. Durch die Einhaltung von REST-Prinzipien können skalierbare, flexible und wartbare Webservices erstellt werden. Spring Boot bietet umfassende Unterstützung für die Entwicklung von RESTful APIs mit minimalem Konfigurationsaufwand.