Eine saubere JSON-API in PHP – richtig antworten und Eingaben lesen
Eine JSON-Schnittstelle in PHP ist mehr als nur json_encode. Ich zeige dir den richtigen Content-Type-Header, passende HTTP-Statuscodes, das Lesen eines JSON-Bodys per php://input und warum du immer JSON_THROW_ON_ERROR setzen solltest.
Wenn ich für eine App oder ein Frontend einen kleinen Endpoint in PHP baue, gehört zu einer sauberen JSON-Antwort mehr als echo json_encode(...). Der richtige Header und ein passender Statuscode machen den Unterschied.
Sauber antworten
<?php
declare(strict_types=1);
function json_response(array $data, int $status = 200): never
{
http_response_code($status);
header('Content-Type: application/json; charset=utf-8');
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
exit;
}Content-Type: application/json sagt dem Client, was kommt – ohne ihn interpretiert der Browser die Antwort als Text. JSON_UNESCAPED_UNICODE hält Umlaute lesbar, JSON_THROW_ON_ERROR wirft bei kaputten Daten eine Exception statt still ein leeres false zu liefern.
Den JSON-Body einer Anfrage lesen
Anders als bei Formularen steht ein JSON-Request nicht in $_POST. Du liest ihn aus dem rohen Input-Stream:
$raw = file_get_contents('php://input');
try {
$input = json_decode($raw, true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException) {
json_response(['error' => 'Ungültiges JSON'], 400);
}
$name = trim((string)($input['name'] ?? ''));
if ($name === '') {
json_response(['error' => 'name fehlt'], 422);
}
json_response(['ok' => true, 'name' => $name], 201);Die richtigen Statuscodes
- 200 ok · 201 angelegt · 400 kaputte Anfrage
- 401/403 nicht eingeloggt / verboten · 404 nicht gefunden
- 422 valide JSON, aber inhaltlich falsch (Feld fehlt) · 500 Serverfehler
Ein Client (z. B. fetch) prüft response.ok anhand dieses Codes – gib also nie „alles 200" zurück, wenn etwas schiefging.
Genau so baue ich die Backends für die Apps meiner Kunden. Brauchst du eine solide API? Schreib mir über bymw.de.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
Beträge und Zahlen in PHP formatieren – number_format, sprintf und Intl
1234.5 ist keine Anzeige, sondern ein Wert. Auf der Rechnung soll 1.234,50 € stehen, in der API 1234.50 und im Dateinamen 1234-50. Drei Aufgaben, drei Werkzeuge – und ein Fehler, den fast jeder einmal macht.
Benannte Argumente in PHP 8 – Schluss mit true, false, null, true
Ein Aufruf wie erstelle($a, true, false, null, true) sagt nichts darüber, was die Wahrheitswerte bedeuten. Mit benannten Argumenten steht es im Aufruf – und optionale Parameter lassen sich überspringen.
Reguläre Ausdrücke in PHP – benannte Gruppen statt $m[3]
Ein Treffer-Array aus Zahlen liest sich nach zwei Wochen wie eine Geheimschrift. Benannte Gruppen geben jedem Teil einen Namen – und preg_replace_callback ersetzt damit Dinge, die kein einfacher Ersetzungsstring kann.