PHP JSON va API bilan ishlash

Mobil ilova, JavaScript frontend yoki boshqa xizmat sizning serveringizdan ma’lumot so’raydi — javob odatda JSON shaklida beriladi.

JSON’ga o’girish

PHP
PHP

JSON’ni o’qish

PHP

Ikkinchi argument true bo’lsa massiv, bo’lmasa obyekt qaytadi. Amalda massiv ko’proq ishlatiladi.

Xatoni ushlash

PHP

JSON_THROW_ON_ERROR bayrog’i xatoda istisno tashlaydi. Usiz json_decode jimgina null qaytaradi va muammoni sezmay qolasiz.

Tashqi API’dan ma’lumot olish

Eng oddiy usul — file_get_contents:

<?php
$javob = file_get_contents("https://api.github.com/repos/php/php-src");
$m = json_decode($javob, true);
echo $m["full_name"], " — ", $m["stargazers_count"], " yulduz";

Lekin u xato va sarlavhalarni boshqara olmaydi. Amalda cURL ishlatiladi:

<?php
function apiSorov(string $url, array $sarlavhalar = []): ?array
{
    $ch = curl_init($url);

    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,    // natijani qaytar, chiqarma
        CURLOPT_TIMEOUT        => 10,      // 10 soniyadan ko'p kutma
        CURLOPT_FOLLOWLOCATION => true,    // yo'naltirishga ergash
        CURLOPT_HTTPHEADER     => array_merge([
            "Accept: application/json",
            "User-Agent: LearnCode/1.0",
        ], $sarlavhalar),
    ]);

    $javob = curl_exec($ch);
    $kod   = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $xato  = curl_error($ch);
    curl_close($ch);

    if ($javob === false) {
        error_log("cURL xatosi: $xato");
        return null;
    }

    if ($kod < 200 || $kod >= 300) {
        error_log("API status: $kod");
        return null;
    }

    try {
        return json_decode($javob, true, 512, JSON_THROW_ON_ERROR);
    } catch (JsonException $e) {
        error_log("JSON xatosi: " . $e->getMessage());
        return null;
    }
}

$repo = apiSorov("https://api.github.com/repos/php/php-src");
echo $repo["full_name"] ?? "olinmadi";

POST so’rovi

<?php
$malumot = ["ism" => "Aziz", "ball" => 85];

$ch = curl_init("https://example.com/api/talabalar");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => json_encode($malumot),
    CURLOPT_HTTPHEADER     => [
        "Content-Type: application/json",
        "Authorization: Bearer " . $token,
    ],
    CURLOPT_TIMEOUT        => 10,
]);

$javob = curl_exec($ch);
$kod = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

Uch narsa muhim: CURLOPT_POST, tanani json_encode bilan berish va Content-Type sarlavhasi.

O’z API’ingizni yozish

<?php
declare(strict_types=1);

header("Content-Type: application/json; charset=utf-8");

function javob(array $malumot, int $kod = 200): never
{
    http_response_code($kod);
    echo json_encode($malumot, JSON_UNESCAPED_UNICODE);
    exit;
}

function xato(string $xabar, int $kod = 400): never
{
    javob(["xato" => $xabar], $kod);
}

// Faqat GET qabul qilamiz
if ($_SERVER["REQUEST_METHOD"] !== "GET") {
    xato("Faqat GET so'rovi qabul qilinadi", 405);
}

$id = filter_input(INPUT_GET, "id", FILTER_VALIDATE_INT);
if ($id === false || $id === null) {
    xato("id butun son bo'lishi kerak", 422);
}

$talaba = $ombor->topId($id);
if ($talaba === null) {
    xato("Talaba topilmadi", 404);
}

javob(["malumot" => $talaba]);

JSON tanasini qabul qilish

$_POST faqat forma ma’lumotini oladi. JSON esa xom oqimdan o’qiladi:

<?php
$xom = file_get_contents("php://input");

try {
    $malumot = json_decode($xom, true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException) {
    xato("Noto'g'ri JSON", 400);
}

if (!is_array($malumot)) {
    xato("Obyekt kutilgan edi", 422);
}

$ism = trim($malumot["ism"] ?? "");
if ($ism === "") {
    xato("ism maydoni majburiy", 422);
}

To’liq javob tuzilishi

PHP

Ma’lumotni malumot kalitiga o’rash — keyinroq qo’shimcha maydon (sahifalash, ogohlantirish) qo’shish imkonini beradi.

Xato javobi

PHP

Xato javobi ham izchil tuzilishga ega bo’lsin — mijoz ilova uni oldindan bilgan holda qayta ishlaydi.

CORS

Brauzerdagi JavaScript boshqa domendagi API’ga so’rov yuborsa, server ruxsat berishi kerak:

<?php
header("Access-Control-Allow-Origin: https://mening-saytim.uz");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type, Authorization");

// Brauzer avval OPTIONS so'rovini yuboradi
if ($_SERVER["REQUEST_METHOD"] === "OPTIONS") {
    http_response_code(204);
    exit;
}

Amaliy mashq

  1. Massivni json_encode bilan chiqaring — bayroqli va bayroqsiz;
  2. JSON matnini massiv va obyekt sifatida o’qing;
  3. JSON_THROW_ON_ERROR bilan buzilgan JSON’ni ushlang;
  4. javob() va xato() yordamchilarini yozing;
  5. status kodlarini to’g’ri tanlab, uch xil xato javobini yasang;
  6. sahifalash ma’lumoti bilan to’liq javob tuzing.

Qisqacha xulosa

  • json_encode da JSON_UNESCAPED_UNICODE deyarli har doim kerak.
  • json_decode($m, true) massiv, true siz — obyekt qaytaradi.
  • JSON_THROW_ON_ERROR — jimgina null o’rniga istisno.
  • Tashqi API’da: tarmoq xatosi, HTTP status va JSON — uchalasini tekshiring; CURLOPT_TIMEOUT majburiy.
  • O’z API’ingizda Content-Type: application/json va to’g’ri status kodi.
  • JSON tanasi $_POST da emas, php://input da keladi.
  • Javob tuzilishi izchil bo’lsin — muvaffaqiyat ham, xato ham.

Keyingi darsda Composer va paketlar — tayyor kutubxonalardan foydalanish.

Bu dars foydali bo'ldimi?

marta ko'rildi