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
JSON’ni o’qish
Ikkinchi argument true bo’lsa massiv, bo’lmasa obyekt qaytadi.
Amalda massiv ko’proq ishlatiladi.
Xatoni ushlash
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
Ma’lumotni malumot kalitiga o’rash — keyinroq qo’shimcha maydon
(sahifalash, ogohlantirish) qo’shish imkonini beradi.
Xato javobi
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
- Massivni
json_encodebilan chiqaring — bayroqli va bayroqsiz; - JSON matnini massiv va obyekt sifatida o’qing;
JSON_THROW_ON_ERRORbilan buzilgan JSON’ni ushlang;javob()vaxato()yordamchilarini yozing;- status kodlarini to’g’ri tanlab, uch xil xato javobini yasang;
- sahifalash ma’lumoti bilan to’liq javob tuzing.
Qisqacha xulosa
json_encodedaJSON_UNESCAPED_UNICODEdeyarli har doim kerak.json_decode($m, true)massiv,truesiz — obyekt qaytaradi.JSON_THROW_ON_ERROR— jimginanullo’rniga istisno.- Tashqi API’da: tarmoq xatosi, HTTP status va JSON — uchalasini
tekshiring;
CURLOPT_TIMEOUTmajburiy. - O’z API’ingizda
Content-Type: application/jsonva to’g’ri status kodi. - JSON tanasi
$_POSTda emas,php://inputda keladi. - Javob tuzilishi izchil bo’lsin — muvaffaqiyat ham, xato ham.
Keyingi darsda Composer va paketlar — tayyor kutubxonalardan foydalanish.