35 HTTP-Methoden (GET, POST, PUT, DELETE)

In der Entwicklung von RESTful Webservices werden verschiedene HTTP-Methoden verwendet, um mit den Ressourcen einer Anwendung zu interagieren. Jede Methode hat eine spezifische Bedeutung und Funktion, um eine Aktion auf eine Ressource auszuführen, wie das Abrufen, Erstellen, Aktualisieren oder Löschen. In diesem Kapitel erläutern wir die gängigen HTTP-Methoden (GET, POST, PUT, DELETE) und wie sie in Spring Boot REST Services implementiert werden.

35.1 Übersicht über die HTTP-Methoden

35.1.1 1. GET

Die GET-Methode wird verwendet, um Ressourcen von einem Server abzurufen. Eine GET-Anfrage sollte keine Seiteneffekte auf dem Server haben und daher zustandslos und idempotent sein. Das bedeutet, dass der Aufruf der gleichen GET-Anfrage mehrfach keine Änderungen auf dem Server bewirken sollte.

35.1.1.1 Beispiel: GET-Anfrage in Spring Boot

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProductController {

    @GetMapping("/products")
    public List<Product> getAllProducts() {
        // Hier wird die Liste der Produkte zurückgegeben
        return productService.getAllProducts();
    }
}

In diesem Beispiel wird die Methode getAllProducts() verwendet, um eine Liste von Produkten über eine GET-Anfrage an die URL /products zurückzugeben.

35.1.2 2. POST

Die POST-Methode wird verwendet, um eine neue Ressource auf dem Server zu erstellen. Im Gegensatz zu GET erzeugt POST Seiteneffekte, da neue Daten auf dem Server gespeichert werden. Eine typische Verwendung von POST ist das Erstellen eines neuen Datensatzes.

35.1.2.1 Beispiel: POST-Anfrage in Spring Boot

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProductController {

    @PostMapping("/products")
    public Product createProduct(@RequestBody Product product) {
        // Hier wird ein neues Produkt erstellt
        return productService.saveProduct(product);
    }
}

In diesem Beispiel erstellt die Methode createProduct() ein neues Produkt, indem die Daten über eine POST-Anfrage gesendet und als @RequestBody empfangen werden.

35.1.3 3. PUT

Die PUT-Methode wird verwendet, um eine vorhandene Ressource vollständig zu aktualisieren. Sie ist ebenfalls idempotent, d.h. das mehrfache Ausführen einer PUT-Anfrage mit denselben Daten hat den gleichen Effekt wie das einmalige Ausführen.

35.1.3.1 Beispiel: PUT-Anfrage in Spring Boot

import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProductController {

    @PutMapping("/products/{id}")
    public Product updateProduct(@PathVariable Long id, @RequestBody Product product) {
        // Hier wird ein vorhandenes Produkt mit neuen Daten aktualisiert
        return productService.updateProduct(id, product);
    }
}

In diesem Beispiel wird das Produkt mit der angegebenen ID durch eine PUT-Anfrage an die URL /products/{id} vollständig aktualisiert.

35.1.4 4. DELETE

Die DELETE-Methode wird verwendet, um eine Ressource vom Server zu löschen. Wie GET und PUT sollte DELETE idempotent sein, d.h. das wiederholte Senden einer DELETE-Anfrage sollte das gleiche Ergebnis haben.

35.1.4.1 Beispiel: DELETE-Anfrage in Spring Boot

import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProductController {

    @DeleteMapping("/products/{id}")
    public void deleteProduct(@PathVariable Long id) {
        // Hier wird ein Produkt basierend auf der ID gelöscht
        productService.deleteProduct(id);
    }
}

In diesem Beispiel löscht die Methode deleteProduct() das Produkt mit der angegebenen ID von der Ressource.

35.2 Erweiterte HTTP-Methoden

Zusätzlich zu den oben genannten Methoden gibt es noch andere HTTP-Methoden, die seltener in RESTful APIs verwendet werden:

35.2.1 PATCH

Die PATCH-Methode wird verwendet, um Teile einer Ressource zu aktualisieren, im Gegensatz zu PUT, das die gesamte Ressource aktualisiert. PATCH wird verwendet, wenn nur bestimmte Felder einer Ressource geändert werden müssen.

Die HEAD-Methode ist ähnlich wie GET, jedoch gibt sie nur die Header-Informationen zurück, ohne den eigentlichen Inhalt der Ressource. Sie wird verwendet, um Metadaten zu einer Ressource abzurufen, z.B. um zu prüfen, ob eine Ressource existiert, bevor eine vollständige GET-Anfrage gestellt wird.

35.2.3 OPTIONS

Die OPTIONS-Methode gibt Informationen darüber zurück, welche HTTP-Methoden von einem bestimmten Endpunkt unterstützt werden. Diese Methode ist nützlich, um herauszufinden, welche Interaktionen mit einer Ressource möglich sind.

35.2.4 TRACE

Die TRACE-Methode dient hauptsächlich zu Debugging-Zwecken. Sie sendet die HTTP-Anfrage zurück, so wie sie empfangen wurde, und wird verwendet, um die Route der Anfrage zu verfolgen.

35.3 Idempotenz und Sicherheit der HTTP-Methoden

Methode Beschreibung Idempotent Sicher
GET Ressource abrufen Ja Ja
POST Ressource erstellen Nein Nein
PUT Ressource vollständig aktualisieren Ja Nein
DELETE Ressource löschen Ja Nein
PATCH Ressource teilweise aktualisieren Nein Nein
HEAD Metadaten der Ressource abrufen Ja Ja
OPTIONS Unterstützte Methoden abfragen Ja Ja
TRACE Anfrage zurückverfolgen Ja Ja

35.4 tl;dr

Die Wahl der richtigen HTTP-Methode ist entscheidend für die semantische Korrektheit einer REST-API. Die Methoden GET, POST, PUT und DELETE bilden das Rückgrat der meisten RESTful Webservices und ermöglichen die CRUD-Operationen (Create, Read, Update, Delete) für Ressourcen. Spring Boot bietet eine einfache und intuitive Möglichkeit, diese Methoden durch Annotationen wie @GetMapping, @PostMapping, @PutMapping und @DeleteMapping zu implementieren, was die Entwicklung von RESTful APIs erleichtert.