In Spring Boot REST-Services werden HTTP-Anfragen an bestimmte
Endpunkte (URLs) mithilfe von Mapping-Annotationen
verarbeitet. Diese Annotationen wie @GetMapping,
@PostMapping, @PutMapping, und
@DeleteMapping sind spezialisierte Formen von
@RequestMapping, die es einfacher machen, spezifische
HTTP-Methoden direkt in den Controller-Methoden zuzuordnen. In diesem
Kapitel behandeln wir die verschiedenen Mapping-Annotationen, ihre
Verwendung und wichtige Parameter, die zur Feinanpassung der Endpunkte
dienen.
Spring Boot bietet verschiedene Mapping-Annotationen, die direkt auf die am häufigsten verwendeten HTTP-Methoden abgestimmt sind. Diese Annotationen machen den Code übersichtlicher und verbessern die Lesbarkeit, indem sie explizit die HTTP-Methode benennen, die die jeweilige Methode verarbeitet.
@GetMapping@GetMapping wird verwendet, um eine Methode an eine
HTTP-GET-Anfrage zu binden. Diese Methode wird häufig verwendet, um
Daten von einer REST-API abzurufen, ohne den Zustand der Anwendung zu
ändern.
@GetMappingimport org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProductController {
@GetMapping("/products")
public List<Product> getAllProducts() {
// Gibt alle Produkte zurück
return productService.getAllProducts();
}
}In diesem Beispiel gibt die Methode getAllProducts()
eine Liste von Produkten als Antwort auf eine GET-Anfrage zurück, die an
die URL /products gesendet wird.
@PostMapping@PostMapping wird verwendet, um eine Methode an eine
HTTP-POST-Anfrage zu binden. Diese Methode wird typischerweise
verwendet, um neue Ressourcen auf dem Server zu erstellen.
@PostMappingimport 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) {
// Erstellt ein neues Produkt
return productService.saveProduct(product);
}
}Hier wird die Methode createProduct() verwendet, um ein
neues Produkt zu erstellen. Die Daten für das neue Produkt werden über
den Request-Body im JSON-Format gesendet.
@PutMapping@PutMapping wird verwendet, um eine Methode an eine
HTTP-PUT-Anfrage zu binden. Diese Methode aktualisiert eine bestehende
Ressource vollständig.
@PutMappingimport org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProductController {
@PutMapping("/products/{id}")
public Product updateProduct(@PathVariable Long id, @RequestBody Product product) {
// Aktualisiert ein Produkt basierend auf der ID
return productService.updateProduct(id, product);
}
}In diesem Beispiel wird die Methode updateProduct()
verwendet, um das Produkt mit der angegebenen ID zu aktualisieren. Die
neuen Produktdaten werden über den Request-Body gesendet.
@DeleteMapping@DeleteMapping wird verwendet, um eine Methode an eine
HTTP-DELETE-Anfrage zu binden. Diese Methode löscht eine bestehende
Ressource.
@DeleteMappingimport 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) {
// Löscht ein Produkt basierend auf der ID
productService.deleteProduct(id);
}
}Hier wird die Methode deleteProduct() verwendet, um das
Produkt mit der angegebenen ID zu löschen.
@PatchMapping@PatchMapping wird verwendet, um eine Methode an eine
HTTP-PATCH-Anfrage zu binden, die typischerweise verwendet wird, um eine
bestehende Ressource teilweise zu aktualisieren.
@PatchMappingimport org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProductController {
@PatchMapping("/products/{id}")
public Product patchProduct(@PathVariable Long id, @RequestBody Map<String, Object> updates) {
// Aktualisiert nur bestimmte Felder des Produkts
return productService.patchProduct(id, updates);
}
}In diesem Beispiel wird die Methode patchProduct()
verwendet, um nur bestimmte Felder eines Produkts basierend auf der ID
zu aktualisieren.
@RequestMappingNeben den spezialisierten Mapping-Annotationen gibt es auch die
allgemeine Annotation @RequestMapping, die für komplexere
Anwendungsfälle verwendet werden kann. Mit @RequestMapping
lassen sich mehrere HTTP-Methoden für denselben Endpunkt angeben oder
benutzerdefinierte HTTP-Header verwenden.
@RequestMapping mit mehreren HTTP-Methodenimport org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProductController {
@RequestMapping(value = "/products", method = {RequestMethod.GET, RequestMethod.POST})
public void handleRequest() {
// Diese Methode unterstützt sowohl GET als auch POST
}
}In diesem Beispiel wird die Methode handleRequest()
sowohl für GET- als auch für POST-Anfragen verwendet.
@RequestMapping mit benutzerdefinierten Headersimport org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProductController {
@RequestMapping(value = "/products", method = RequestMethod.GET, headers = "X-API-KEY=my-api-key")
public List<Product> getProducts() {
// Diese Methode wird nur aufgerufen, wenn der Header 'X-API-KEY' gesetzt ist
return productService.getAllProducts();
}
}In diesem Beispiel wird die Methode nur dann aufgerufen, wenn ein
spezifischer HTTP-Header (X-API-KEY) in der Anfrage
enthalten ist.
Mapping-Annotationen wie @GetMapping und
@PostMapping bieten die Möglichkeit, zusätzliche Parameter
zu definieren, um die Anfragen genauer zu spezifizieren:
application/json).params und headersimport org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProductController {
@GetMapping(value = "/products", params = "category", headers = "X-API-VERSION=1")
public List<Product> getProductsByCategory(@RequestParam String category) {
// Gibt Produkte basierend auf der Kategorie zurück, wenn der API-Version-Header korrekt ist
return productService.getProductsByCategory(category);
}
}Hier wird die Methode getProductsByCategory() nur dann
aufgerufen, wenn der Parameter category in der URL
enthalten ist und der HTTP-Header X-API-VERSION=1 gesetzt
ist.
Spring bietet die Klasse ResponseEntity, um detaillierte
Kontrolle über die HTTP-Antwort zu haben, einschließlich Statuscodes,
Headern und Body-Inhalten. Dies ist besonders nützlich, wenn Sie
zusätzliche Metadaten oder spezifische Statuscodes zurückgeben
möchten.
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProductController {
@GetMapping("/products/{id}")
public ResponseEntity<Product> getProductById(@PathVariable Long id) {
Product product = productService.getProductById(id);
if (product != null) {
return new ResponseEntity<>(product, HttpStatus.OK);
} else {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
}
}In diesem Beispiel wird eine HTTP-Antwort mit dem Statuscode
200 OK zurückgegeben, wenn das Produkt gefunden wird. Falls
nicht, wird eine Antwort mit dem Statuscode 404 Not Found
zurückgegeben.
Spring Boot vereinfacht die Entwicklung von REST-Services erheblich
durch die Verwendung von Mapping-Annotationen wie
@GetMapping, @PostMapping,
@PutMapping, und @DeleteMapping. Diese
Annotationen ermöglichen eine klare und übersichtliche Zu
ordnung von HTTP-Anfragen zu Controller-Methoden. Mit zusätzlichen
Parametern wie headers, params, und der
Verwendung von ResponseEntity können Sie die API flexibel
anpassen und eine Vielzahl von Anforderungen abdecken.