Dies ist ein Einführungs-Tutorial zur Erstellung einer REST-API, die CRUD-Operationen durchführt. Sie kann Daten abrufen, hinzufügen, aktualisieren und löschen.
Abhängigkeit
Sie müssen die Abhängigkeit "spring boot-starter-web" zusätzlich zu Ihrer "Spring" Standardabhängigkeit ("spring boot-starter-parent") hinzufügen.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Erläuterung
Eine REST-API hat Endpunkte, die eine "URL" darstellen, auf die zugegriffen werden kann, um Daten von der API zu senden oder abzurufen. Sie müssen "HTTP"-Befehle wie "GET", "POST", "DELETE", "UPDATE" und mehr verwenden, um mit der API zu kommunizieren.
- "GET": Daten von der API abrufen.
- "POST": Daten an die API senden. Sie möchten z.B. ein neues Objekt hinzufügen.
- "UPDATE": Daten aktualisieren. Sie möchten ein Objekt aktualisieren.
- "DELETE": Daten löschen. Ein existierendes Objekt löschen.
API-Endpunkte werden in einer Klasse gruppiert, die ein "RestController" ist. Eine "RestController"-Klasse wird unter Verwendung der Anmerkung "@RestController" erstellt. Beispiel: Wenn Sie Produkte und Adressen in Ihrer API speichern möchten, dann müssen Sie eine "RestController"-Klasse für Produkte und eine "RestController"-Klasse für Adressen erstellen.
Ein API-Endpunkt könnte ein bestimmtes Produkt mit der Produkt-ID "1" aus Ihrer Datenbank laden. API-Endpunkte werden durch Hinzufügen einer "Mapping"-Anmerkung zu einer Funktion deklariert, die die Funktionalität dieses API-Endpunktes hat.
Diese "Mapping"-Anmerkungen sind zum Beispiel verfügbar:
@GetMapping("/MY_API_URL")
@PostMapping("/MY_API_URL")
@PutMapping("/MY_API_URL")
@DeleteMapping("/MY_API_URL")
Diese führen die oben erwähnten "HTTP"-Operationen aus. Sie fügen eine dieser Anmerkungen zu einer Funktion hinzu, um die Funktionalität dieser Operation zu implementieren.
Parameter sind durch ihren Namen in geschweiften Klammern in der "URI" definiert und werden mit der Anmerkung "@PathVariable" zu den Argumenten einer Funktion hinzugefügt. Sie können dann von der Funktion abgerufen werden.
Beispiel:
@GetMapping("/customer/{customerId}")
public ResponseEntity<Customer> getCustomerById(@PathVariable Long id) {
...
}
Wenn Sie die API-URL mit einer beliebigen Zahl "/customer/1" aufrufen, dann wird die Funktion "getCustomerById" aufgerufen. Die Anmerkung "GetMapping" bildet die API-URL auf diese Funktion und die übergebene id "id" auf die "Long"-Variable "id" im Argument dieser Funktion ab.
Wenn Sie Daten an die "API" senden wollen, dann müssen Sie ein JSON-Objekt im "Body" der HTTP-Anforderung verwenden. In diesem Fall wird eine "@PostMapping"-Annotation verwendet. Die Annotation "@RequestBody" wird verwendet, um ein JSON-Objekt (das vom API-Benutzer gesendet wird) auf die Argumentvariable einer API-Funktion abzubilden. Die gesamte Kommunikation zwischen der API und dem Client erfolgt über JSON-Objekte.
Die Funktion des API-Endpunkts liefert ein "ResponseEntity"-Objekt zurück, das ein Objekt und einen HTTP-Statuscode enthält. Wenn die "API" Anfrage erfolgreich war, dann werden das angeforderte Objekt und der HTTP-Status "200 OK" zurückgegeben.
Die erwähnten "Mapping"-Anmerkungen haben auch zusätzliche Argumente.
Beispiel:
@PostMapping(path= "/save", consumes = "application/json", produces = "application/json")
Das Argument "consumes" definiert die Objektdaten des Datentyps, die an die API gesendet werden". "produces" definiert den Objektdatentyp, der von der API zurückgegeben wird.
@RequestMapping(path="/users")
Mithilfe dieses Befehls können Sie einen Basispfad für die API-Endpunkte der Klasse "RestController" definieren.
Programmier-Beispiel
Dies ist ein Beispiel, wie ein Kunde geladen, hinzugefügt, aktualisiert oder gelöscht werden kann. Die Klasse "CustomerService" wird verwendet, um auf die Methoden zuzugreifen, die die Datenbankoperationen durchführen. Die Modellklasse "Customer" speichert einen Kunden mit den Feldern wie "customerId", "companyName", "forename" und mehr.
@RestController
public class CustomerController {
@Autowired
private CustomerService customerService;
private final String BASE_API_URL = "/api/customer";
/**
* Alle Kunden abrufen. HTTP GET-Befehl.
*
* @return
*/
@GetMapping(BASE_API_URL + "/all")
public ResponseEntity<List<Customer>> getAllCustomer() {
List<Customer> customerList = this.customerService.getAllCustomer();
if (!CollectionUtils.isEmpty(customerList)) {
return status(HttpStatus.OK).body(customerList);
} else {
return status(HttpStatus.BAD_REQUEST).body(new ArrayList<Customer>());
}
}
/**
* Kunde mit bestimmter Id abrufen. HTTP GET-Befehl.
*
* @return
*/
@GetMapping(BASE_API_URL + "/get/byEmail/{email}")
public ResponseEntity<Customer> getOwnerByEmail(@PathVariable String email) {
try {
return status(HttpStatus.OK).body(this.customerService.getCustomerByEmail(email));
} catch (DataValueNotFoundException e) {
return status(HttpStatus.BAD_REQUEST).body(new Customer());
}
}
/**
* Kunde hinzufügen. HTTP POST-Befehl.
* @param newCustomer
* @return
*/
@PostMapping(BASE_API_URL + "/add")
public ResponseEntity<String> addCustomer(@RequestBody Customer newCustomer) {
int resultCode = this.customerService.save(newCustomer);
switch (resultCode) {
case 0:
return ResponseEntity.ok("OK. Customer was added successfully.");
case 1:
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("ERROR. Customer cannot be null!");
case 2:
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("ERROR. Customer could not be saved!");
case 3:
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body("ERROR. Customer E-Mail already exists! Please select another e-mail.");
default:
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("ERROR. Customer could not be saved!");
}
}
/**
* Bestehenden Kunden aktualisieren. HTTP PUT-Befehl.
* @param id
* @param customer
* @return
*/
@PutMapping(BASE_API_URL + "/update/{id}")
public ResponseEntity<String> updateOwner(@PathVariable Long id, @RequestBody Customer customer) {
int resultCode = this.customerService.update(customer);
switch (resultCode) {
case 0:
return ResponseEntity.ok("OK. Update was successful.");
case 1:
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("ERROR. Customer cannot be null!");
case 2:
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("ERROR. Customer does not exist!");
case 3:
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body("ERROR. Customer E-Mail already exists! Please select another e-mail.");
default:
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("ERROR. Update failed!");
}
}
/**
* Bestehenden Kunden löschen. HTTP DELETE-Befehl.
* @param customerId
* @return
*/
@DeleteMapping(BASE_API_URL + "/delete/{id}")
public ResponseEntity<String> deleteAccountType(@PathVariable Long customerId) {
if (this.customerService.deleteById(customerId)) {
return ResponseEntity.ok("Your customer was deleted successfully.");
} else {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Error. Customer does not exists!");
}
}
}
Hier kann auf die API über die Basisurl "/api/customer" und den jeweiligen API-Endpunkt zugegriffen werden.
Wenn Sie zum Beispiel alle Kunden erhalten möchten, würden Sie diese API-URL mit dem HTTP-Befehl "GET" aufrufen:
/api/customer/all
Testen der erstellten "REST-API
Sie können die Anwendung "Postman" verwenden, um Ihre API zu testen. Wenn Sie nur die Ausgabe sehen wollen, dann können Sie die API-URL direkt aufrufen.
Testen der API-Endpunktmethode "getAllCustomer":
GET /api/customer/all
TDie Ausgabe der "API" wird im "Body" als JSON-Objekt angezeigt.
Dokumentation Spring Boot:
https://docs.spring.io/spring-boot/docs/current/api/
Postman herunterladen:
https://www.postman.com/downloads/
Dokumentation Spring:
https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/
https://docs.spring.io/spring-framework/docs/current/javadoc-api/