Kodokon kodokon.com

PHP में एक JSON API बनाना

हेडर, कच्चे बॉडी को पढ़ने और स्टेटस कोड के सूक्ष्म अर्थ में महारत हासिल करके एक कठोर JSON API बनाएँ।

9 मिनट · 3 प्रश्न

इस पाठ को Kodokon में खोलें

एक JSON API एक अनुबंध है: हर प्रतिक्रिया अपना टाइप (Content-Type: application/json), सही स्टेटस कोड और एक स्थिर संरचना घोषित करती है। PHP डिफ़ॉल्ट रूप से इनमें से कुछ नहीं भेजता - यह text/html घोषित करता है। पहला निर्माण खंड: एक ही रिस्पॉन्स हेल्पर, जिसका टाइप never है (PHP 8.1+)। यह रिटर्न टाइप इंजन के साथ-साथ स्थैतिक विश्लेषण उपकरणों को भी गारंटी देता है कि फ़ंक्शन कभी नियंत्रण वापस नहीं सौंपता: किसी कॉल के बाद लिखा गया कोई भी कोड प्रमाणित रूप से अगम्य है।

PHP
<?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
<?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
        );
}
मानता है कि jsonResponse ऊपर परिभाषित है; बिना वेरिएबल वाला catch PHP 8 है।

कोड को सटीकता से चुनें, क्योंकि आपके क्लाइंट आपके संदेशों के विरुद्ध नहीं, बल्कि इनके विरुद्ध प्रोग्राम करेंगे: 200 सफल पठन, 201 निर्माण (संसाधन की ओर इंगित करने वाले एक Location हेडर के साथ), 204 बिना बॉडी वाली सफलता, 400 विकृत JSON, 404 अनुपलब्ध संसाधन, 405 असंभाला गया मेथड (अनुमत मेथड की सूची देने वाले एक Allow हेडर के साथ), और 422 ऐसे JSON के लिए जो वाक्य-रचना की दृष्टि से मान्य है लेकिन अर्थगत रूप से गलत है। यह सब curl -i से जाँचें, जो प्राप्त हेडर प्रदर्शित करता है।

BASH
curl -i -X POST http://localhost:8000/items \
  -H 'Content-Type: application/json' \
  -d '{"name":"Widget"}'
-i विकल्प स्टेटस और हेडर दिखाता है: अनुबंध की एकमात्र वास्तविक परीक्षा।

ज्ञान जांच

सुनिश्चित करें कि आपको इस पाठ के मुख्य बिंदु याद हैं।

  1. आपका API एक JSON बॉडी के साथ एक POST प्राप्त करता है: $_POST खाली क्यों है?
    • PHP $_POST को केवल form-urlencoded और multipart बॉडी के लिए भरता है; एक JSON बॉडी php://input से पढ़ी जाती है
    • JSON डिफ़ॉल्ट post_max_size सीमा से अधिक है
    • इसे भरने के लिए आपको पहले $_POST पर json_decode को कॉल करना होगा
  2. POST के माध्यम से सफल निर्माण के बाद आपको कौन सा स्टेटस कोड लौटाना चाहिए?
    • 200
    • 201
    • 204
    • 302
  3. never रिटर्न टाइप क्या गारंटी देता है?
    • फ़ंक्शन हमेशा null लौटाता है
    • फ़ंक्शन कभी नियंत्रण वापस नहीं सौंपता: यह exit या किसी अपवाद के साथ समाप्त होता है, और इंजन इसकी पुष्टि करता है
    • फ़ंक्शन को किसी चाइल्ड क्लास द्वारा ओवरराइड नहीं किया जा सकता