API-Referenz
testingapis.com ist eine kostenlose API zum Testen von HTTP-Clients. Sie hat 360 Endpunkte in 53 Gruppen: realistische Ressourcen wie Produkte, Bücher und Länder, dazu Endpunkte für Statuscodes, Weiterleitungen, Cookies, Caching, Authentifizierungsverfahren, Dateiformate, Streaming und Fehlerinjektion. Echo, HTTP-Methoden, Statuscodes und die Ressourcen products, posts und todos brauchen kein Konto. Der Rest braucht ein kostenloses Konto.
https://api.testingapis.comfetch('https://api.testingapis.com/api/Products?limit=3')
.then(res => res.json())
.then(data => console.log(data))Discovery
| Was | Wo |
|---|---|
| OpenAPI-3.0-Dokument | https://api.testingapis.com/openapi/v1.jsonAnmelden zum Ansehen |
| Swagger UI | https://api.testingapis.com/swagger/index.htmlAnmelden zum Ansehen |
| Live-Routenkatalog | GET https://api.testingapis.com/apiAnmelden zum Ansehen |
| Health Checks | GET https://api.testingapis.com/api/healthGET https://api.testingapis.com/api/health/liveGET https://api.testingapis.com/api/health/ready |
| GraphQL | |
| WebSockets | wss://api.testingapis.com/ws/echowss://api.testingapis.com/ws/ticker |
Authentifizierung
Endpunkte ohne Hinweis zur Authentifizierung sind öffentlich. Die Endpunkte, die Authentifizierung testen, nehmen die festen Testzugangsdaten unten an. Sie sind nicht geheim.
| Verfahren | So wird es gesendet | Testwerte | Genutzt von |
|---|---|---|---|
| HTTP Basic | Authorization: Basic base64(user:pass) | apibee / password123 · Admin / Admin@1234 (ursprüngliche API) | /api/auth/basic*, /api/AuthTest/secure-data |
| Bearer (static) | Authorization: Bearer <token> | apibee-token-123 · admin-token · user-token · readonly-token | /api/auth/bearer, /api/auth/roles/* |
| JWT | Authorization: Bearer <jwt> | POST /api/auth/jwt/login mit admin / admin123 oder user / user123 · POST /api/User/Login mit Michael / Thompson | /api/auth/jwt/me, /api/auth/jwt/admin, /api/Admin/authorize |
| API key | Header X-API-Key, ?api_key= oder Cookie api_key | apibee-key-123 | /api/auth/api-key/* |
| OAuth 2.0 | Authorization: Bearer <access_token> | Clients apibee-client / apibee-secret und apibee-public (PKCE) · Benutzer apibee / password123, jane / jane123 | /api/auth/oauth/protected, /userinfo |
| OAuth 1.0a | Authorization: OAuth oauth_consumer_key="…", oauth_signature="…", … | Consumer apibee-consumer-key / apibee-consumer-secret · Token apibee-access-token / apibee-token-secret (läuft nie ab) · HMAC-SHA1, HMAC-SHA256, HMAC-SHA512 oder PLAINTEXT | /api/auth/oauth1, /api/auth/oauth1/* |
| Digest | Challenge und Response nach RFC 7616 | apibee / password123 | /api/auth/digest |
| HMAC-Signatur | Header X-Timestamp und X-Signature | Geheimnis apibee-hmac-secret | /api/auth/hmac |
| Session-Cookie | Cookie apibee_session | POST /api/cookies/login mit test / test123 oder admin / admin123 | /api/cookies/me |
| CSRF | Cookie XSRF-TOKEN und Header X-CSRF-Token | Token aus GET /api/auth/csrf/token | /api/auth/csrf/submit |
401 heißt, die Zugangsdaten fehlen oder sind ungültig. 403 heißt, sie sind gültig, aber nicht erlaubt, zum Beispiel user-token an /api/auth/roles/admin.
Die Beispiele nutzen diese Platzhalter für Werte, die sich bei jedem Lauf ändern:
| Platzhalter | Woher er kommt |
|---|---|
{{userJwt}} / {{adminJwt}} | accessToken aus POST /api/auth/jwt/login mit user / user123 oder admin / admin123. |
{{refreshToken}} | refreshToken aus POST /api/auth/jwt/login. |
{{legacyJwt}} | token aus POST /api/User/Login mit Michael / Thompson (Rolle Admin). |
{{oauthAccessToken}} | access_token aus POST /api/auth/oauth/token. |
{{oauth1RequestToken}} / {{oauth1RequestSecret}} / {{oauth1Verifier}} | oauth_token und oauth_token_secret aus POST /api/auth/oauth1/request_token mit oauth_callback=oob, dann oauth_verifier aus GET /api/auth/oauth1/authorize. |
{{csrfToken}} | token aus GET /api/auth/csrf/token. Derselbe Wert wird als Cookie XSRF-TOKEN gesetzt. |
{{sessionId}} | Cookie apibee_session, gesetzt von POST /api/cookies/login (test / test123). |
{{unixTimestamp}} / {{hmacSignature}} | Die aktuelle Unix-Zeit in Sekunden und der hexadezimale HMAC-SHA256 von "{timestamp}.{raw body}" mit dem Schlüssel apibee-hmac-secret. |
{{uuid}} | Eine beliebige neue UUID, als Idempotency-Key. |
Melde dich an, um die Details zu sehen
Die Parameter, die Beispiele für Request und Antwort und das Live-Panel Try it für die Authentifizierungsendpunkte sind für angemeldete Mitglieder. Konten sind kostenlos und in wenigen Sekunden angelegt.
Verzögerungen und simulierte Fehler
Zwei Query-Parameter funktionieren an jedem Endpunkt:
| Parameter | Wirkung | Beispiel |
|---|---|---|
delay | Wartet N Sekunden vor der Antwort. Höchstens 10. | /api/Products?delay=2 |
error | Gibt statt der echten Antwort einen simulierten Fehler zurück: 400, 401, 403, 404, 408, 429, 500, 502 oder 503. Setzt den Header X-Simulated: true. | /api/Products?error=503 |
Kombiniert, wie in ?delay=2&error=503, wartet der Request und schlägt dann fehl. Ein simulierter Fehler sieht so aus:
{
"status": 503,
"error": "Service Unavailable",
"message": "Simulated error. Use ?error={code} to test different status codes.",
"simulated": true
}Filtern, Sortieren und Paginierung
Jeder Listen-Endpunkt einer Ressource, etwa GET /api/Products, nimmt diese Query-Parameter an:
| Parameter | Bedeutung | Beispiel |
|---|---|---|
limit | Seitengröße, 1 bis 100. Ohne ihn kommen alle Datensätze zurück. | ?limit=10 |
page | Seitennummer ab 1. Braucht limit. | ?limit=10&page=2 |
offset | Überspringt N Datensätze, als Alternative zu page. | ?limit=10&offset=20 |
sort, order | Sortiert nach einem beliebigen Feld. order ist asc (Standard) oder desc. | ?sort=price&order=desc |
q | Suche ohne Beachtung der Groß- und Kleinschreibung in den Feldern title, name, body, description und text. | ?q=keyboard |
beliebiges Feld | Exakter Filter auf diese Eigenschaft, ohne Beachtung der Groß- und Kleinschreibung. | ?category=books&inStock=true |
Listen geben ein einfaches JSON-Array zurück. Die Summen stehen in den Headern X-Total-Count, X-Page, X-Per-Page und X-Total-Pages. Paginierung per Cursor, Link-Header, Keyset und HAL zeigt Paginierung.
Antworten und Fehler
| Situation | Status | Body |
|---|---|---|
| Einen Datensatz abrufen | 200 | Der Datensatz |
| Datensätze auflisten | 200 | Array von Datensätzen, plus Paginierungs-Header |
| Anlegen | 201 | { message, data } |
| Massenhaft anlegen | 201 | { message, data: [ … ] } |
| Ersetzen oder ändern | 200 | { message, data } |
| Teilweise ändern (PATCH) | 200 | { message, changed, ignored, data } |
| Löschen | 200 | { message } |
| Massenhaft löschen | 200 | { message, deleted, notFound } |
| Fehler | 4xx oder 5xx | { status, error, message } |
| Validierungsfehler des Modells | 400 | application/problem+json mit Fehlern pro Feld |
| Fachliche Validierung | 422 | application/problem+json (RFC 7807) mit Fehlern pro Feld |
{
"status": 404,
"error": "Not Found",
"message": "Book with ID 999 does not exist."
}Jede Antwort erlaubt jeden Origin (Access-Control-Allow-Origin: *, ohne Credentials) und gibt Browser-Code die Header für Paginierung, Caching, Rate Limit und Versionierung frei. Die X-RateLimit-*-Header dienen nur zur Information; echt begrenzt wird nur bei Rate Limiting.
Alle Daten liegen im Speicher. Anlegen, Ändern und Löschen funktioniert, aber beim Neustart des Servers springt alles auf die Startdaten zurück.
Aufrufe aus dem Browser
- Cookies. Browser lassen JavaScript den Cookie-Header nicht setzen, und Cross-Origin-Requests tragen keine Credentials. Cookie-basierte Endpunkte funktionieren nur vom selben Origin oder über den Proxy.
- Weiterleitungen.
fetch()folgt Weiterleitungen und verbirgt die 3xx-Antwort. Um den echten Status und den Location-Header zu sehen, nutze den Proxy. - Proxy.
POST /api/Proxy/callleitet einen Request vom Server aus weiter und gibt dessen Status und Body zurück. Das umgeht die Grenzen bei CORS, Cookies und Weiterleitungen, gibt aber keine Antwort-Header weiter. - Streams.
/api/stream/sseist Server-Sent Events. Die Streams NDJSON, chunked, drip und JSON-Array kommen nach und nach an; lies sie mit einem Streaming-Reader. - WebSockets.
/ws/echound/ws/tickerbrauchen die WebSocket-API, nicht fetch. - Digest-Auth. Browser führen Challenge und Response nur über ihren eigenen Login-Dialog aus.
- Fehlerinjektion.
/api/chaos/abortund/api/chaos/partialbrechen die Verbindung absichtlich ab./api/chaos/timeoutund/api/chaos/slowkönnen bis zu 60 Sekunden dauern. - Verbotene Header. Browser weigern sich, Host, Content-Length, Accept-Encoding, Cookie und einige andere zu setzen.
Melde dich an, um die Details zu sehen
Die Parameter, die Beispiele für Request und Antwort und das Live-Panel Try it für diese Hinweise sind für angemeldete Mitglieder. Konten sind kostenlos und in wenigen Sekunden angelegt.
Endpunkte
360 Endpunkte in 53 Gruppen. Jede Gruppe öffnet ihre Referenz mit Parametern sowie Beispielen für Requests und Antworten.
Erste Schritte
4 EndpunkteEin Live-Katalog aller Endpunkte, dazu Health Checks.
HTTP-Grundlagen
44 EndpunkteMethoden, Statuscodes, Weiterleitungen, Cookies, Caching und Request-Bodies.
Formate und Daten
62 EndpunkteGängige Content-Types, Datei-Downloads, JSON-Grenzfälle und Hilfsfunktionen.
Authentifizierung und Sicherheit
38 EndpunkteAuth-Verfahren, OAuth 2.0 und 1.0a, JWT, Rate Limiting und Zahlungen.
API-Muster
50 EndpunkteStreaming, WebSockets, asynchrone Jobs, Paginierung, Fehlerinjektion und mehr.
Ressourcen
142 EndpunkteRealistische Datensätze wie Produkte, Posts, Bücher und Länder.
Ursprüngliche API
20 EndpunkteDie erste Version der API: Benutzer in JSON und XML, Uploads und Auth-Tests.