हेडर, कच्चे बॉडी को पढ़ने और स्टेटस कोड के सूक्ष्म अर्थ में महारत हासिल करके एक कठोर JSON API बनाएँ।
इस पाठ को Kodokon में खोलेंएक JSON API एक अनुबंध है: हर प्रतिक्रिया अपना टाइप (Content-Type: application/json), सही स्टेटस कोड और एक स्थिर संरचना घोषित करती है। PHP डिफ़ॉल्ट रूप से इनमें से कुछ नहीं भेजता - यह text/html घोषित करता है। पहला निर्माण खंड: एक ही रिस्पॉन्स हेल्पर, जिसका टाइप never है (PHP 8.1+)। यह रिटर्न टाइप इंजन के साथ-साथ स्थैतिक विश्लेषण उपकरणों को भी गारंटी देता है कि फ़ंक्शन कभी नियंत्रण वापस नहीं सौंपता: किसी कॉल के बाद लिखा गया कोई भी कोड प्रमाणित रूप से अगम्य है।
<?php
declare(strict_types=1);
function jsonResponse(
mixed $data,
int $status = 200
): never {
http_response_code($status);
header('Content-Type: application/json');
echo json_encode(
$data,
JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE
);
exit;
}
jsonResponse(['status' => 'ok']);एक दूसरी सूक्ष्मता, जो अक्सर बहुत देर से पता चलती है: किसी JSON बॉडी के सामने $_POST खाली रहता है। PHP इसे केवल application/x-www-form-urlencoded और multipart/form-data के लिए भरता है। कच्चा बॉडी php://input स्ट्रीम से पढ़ा जाता है। इसे JSON_THROW_ON_ERROR के साथ डिकोड करें: उस फ़्लैग के बिना, त्रुटि होने पर json_decode चुपचाप null लौटाता है - ऐसे बॉडी से अप्रभेद्य जिसमें वस्तुतः null हो। और never टाइप की बदौलत, नीचे दिए गए switch को किसी भी break की आवश्यकता नहीं है।
<?php
declare(strict_types=1);
switch ($_SERVER['REQUEST_METHOD']) {
case 'GET':
jsonResponse(['items' => []]);
case 'POST':
$raw = (string) file_get_contents(
'php://input'
);
try {
$payload = json_decode(
$raw,
true,
512,
JSON_THROW_ON_ERROR
);
} catch (JsonException) {
jsonResponse(
['error' => 'Malformed JSON'],
400
);
}
header('Location: /items/42');
jsonResponse(['created' => $payload], 201);
default:
header('Allow: GET, POST');
jsonResponse(
['error' => 'Method not allowed'],
405
);
}कोड को सटीकता से चुनें, क्योंकि आपके क्लाइंट आपके संदेशों के विरुद्ध नहीं, बल्कि इनके विरुद्ध प्रोग्राम करेंगे: 200 सफल पठन, 201 निर्माण (संसाधन की ओर इंगित करने वाले एक Location हेडर के साथ), 204 बिना बॉडी वाली सफलता, 400 विकृत JSON, 404 अनुपलब्ध संसाधन, 405 असंभाला गया मेथड (अनुमत मेथड की सूची देने वाले एक Allow हेडर के साथ), और 422 ऐसे JSON के लिए जो वाक्य-रचना की दृष्टि से मान्य है लेकिन अर्थगत रूप से गलत है। यह सब curl -i से जाँचें, जो प्राप्त हेडर प्रदर्शित करता है।
curl -i -X POST http://localhost:8000/items \
-H 'Content-Type: application/json' \
-d '{"name":"Widget"}'