186 lines
3.2 KiB
Markdown
186 lines
3.2 KiB
Markdown
# 8.2 Schnittstellen
|
|
|
|
## API-Typen
|
|
|
|
### REST (Representational State Transfer)
|
|
|
|
```
|
|
REST-Prinzipien
|
|
├── Ressourcen-orientiert
|
|
├── Stateless
|
|
├── Einheitliche Schnittstelle
|
|
├── Client-Server
|
|
└── Cache-fähig
|
|
```
|
|
|
|
### REST-Endpunkte
|
|
|
|
```
|
|
Beispiel: Benutzer-API
|
|
|
|
GET /api/benutzer → Alle Benutzer
|
|
GET /api/benutzer/123 → Ein Benutzer
|
|
POST /api/benutzer → Erstellen
|
|
PUT /api/benutzer/123 → Aktualisieren
|
|
DELETE /api/benutzer/123 → Löschen
|
|
```
|
|
|
|
### REST-Beispiel
|
|
|
|
```javascript
|
|
// Express.js Server
|
|
const express = require('express');
|
|
const app = express();
|
|
|
|
app.get('/api/benutzer/:id', async (req, res) => {
|
|
const benutzer = await findBenutzer(req.params.id);
|
|
res.json(benutzer);
|
|
});
|
|
|
|
app.post('/api/benutzer', async (req, res) => {
|
|
const neuerBenutzer = await createBenutzer(req.body);
|
|
res.status(201).json(neuerBenutzer);
|
|
});
|
|
```
|
|
|
|
---
|
|
|
|
## SOAP (Simple Object Access Protocol)
|
|
|
|
### Unterschiede zu REST
|
|
|
|
| Kriterium | REST | SOAP |
|
|
|-----------|------|------|
|
|
| Format | JSON, XML | Nur XML |
|
|
| Transport | HTTP | HTTP, SMTP |
|
|
| Stateless | Ja | Optional |
|
|
| Größe | Klein | Groß |
|
|
|
|
### SOAP-Beispiel
|
|
|
|
```xml
|
|
<?xml version="1.0"?>
|
|
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
|
|
<soap:Header/>
|
|
<soap:Body>
|
|
<GetUserRequest xmlns="http://beispiel.de/api">
|
|
<UserId>123</UserId>
|
|
</GetUserRequest>
|
|
</soap:Body>
|
|
</soap:Envelope>
|
|
```
|
|
|
|
---
|
|
|
|
## GraphQL
|
|
|
|
### Konzepte
|
|
|
|
```
|
|
GraphQL - Besonderheiten
|
|
├── Eine Anfrage, viele Daten
|
|
├── Client definiert benötigte Felder
|
|
├── Stark typisiert (Schema)
|
|
└── Keine Over- oder Underfetching
|
|
```
|
|
|
|
### GraphQL-Beispiel
|
|
|
|
```graphql
|
|
# Anfrage
|
|
query {
|
|
user(id: "123") {
|
|
name
|
|
email
|
|
orders {
|
|
id
|
|
total
|
|
}
|
|
}
|
|
}
|
|
|
|
# Antwort
|
|
{
|
|
"data": {
|
|
"user": {
|
|
"name": "Max",
|
|
"email": "max@example.com",
|
|
"orders": [
|
|
{ "id": "1", "total": 99.99 }
|
|
]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## API-Design Best Practices
|
|
|
|
### URL-Design
|
|
|
|
```
|
|
Richtlinien
|
|
├── Ressourcen plural (benutzer nicht benutzer)
|
|
├── Bindestrich für Wörter (benutzer-profil)
|
|
├── Kleinbuchstaben
|
|
├── Keine Verben im Pfad
|
|
└── Query-Parameter für Filter
|
|
```
|
|
|
|
### HTTP-Statuscodes
|
|
|
|
| Code | Bedeutung | Verwendung |
|
|
|------|-----------|------------|
|
|
| 200 | OK | Erfolgreich |
|
|
| 201 | Created | Erstellt |
|
|
| 400 | Bad Request | Ungültige Anfrage |
|
|
| 401 | Unauthorized | Nicht angemeldet |
|
|
| 404 | Not Found | Nicht gefunden |
|
|
| 500 | Server Error | Fehler |
|
|
|
|
---
|
|
|
|
## API-Dokumentation
|
|
|
|
### OpenAPI (Swagger)
|
|
|
|
```yaml
|
|
openapi: 3.0.0
|
|
info:
|
|
title: Meine API
|
|
version: 1.0.0
|
|
paths:
|
|
/benutzer:
|
|
get:
|
|
summary: Alle Benutzer
|
|
responses:
|
|
'200':
|
|
description: Erfolgreich
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/Benutzer'
|
|
```
|
|
|
|
### Tools
|
|
|
|
| Tool | Beschreibung |
|
|
|------|-------------|
|
|
| Swagger UI | Interaktive Dokumentation |
|
|
| Postman | API-Testing |
|
|
| Insomnia | API-Client |
|
|
|
|
---
|
|
|
|
## Querverweise
|
|
|
|
- [[LF8-01-Datenquellen|Zurück: Datenquellen]]
|
|
- [[LF8-03-Datenformate|Nächstes Thema: Datenformate]]
|
|
|
|
---
|
|
|
|
*Stand: 2024*
|