Xallar
117
Mesajlar
282
- Yer
- Azərbaycan
- Mesajlar
- 282
- Qoşulub
- 1 Oktyabr 2022
- Reaksiya xalı
- 196
- Yaş
- 34
- Xallar
- 117
- Sayt
- https://mast.az
Problem:
Veb tətbiqlərdə xarici API-lərdən məlumat çəkmək gündəlik bir işdir. Lakin JSON API sorğularını düzgün və təhlükəsiz şəkildə idarə etmək, xüsusilə də cavabların etibarlılığını yoxlamaq çox vaxt gözardı edilir. Köhnə üsullar təhlükəsizlik boşluqlarına və ya gözlənilməz xətalara səbəb ola bilər. Məsələn,
Həll:
Xarici JSON API-lərdən məlumatları təhlükəsiz və səmərəli şəkildə çəkmək üçün PHP 8.2+ versiyalarında
Məntiqi Əsaslandırma:
Bu yanaşma bir neçə əsas üstünlüyə malikdir:
Veb tətbiqlərdə xarici API-lərdən məlumat çəkmək gündəlik bir işdir. Lakin JSON API sorğularını düzgün və təhlükəsiz şəkildə idarə etmək, xüsusilə də cavabların etibarlılığını yoxlamaq çox vaxt gözardı edilir. Köhnə üsullar təhlükəsizlik boşluqlarına və ya gözlənilməz xətalara səbəb ola bilər. Məsələn,
file_get_contents kimi funksiyaların birbaşa istifadəsi SSL yoxlamalarını düzgün aparmaya bilər və bu da təhlükəli vəziyyətlər yarada bilər.Həll:
Xarici JSON API-lərdən məlumatları təhlükəsiz və səmərəli şəkildə çəkmək üçün PHP 8.2+ versiyalarında
cURL kitabxanası və json_decode funksiyasının düzgün istifadəsi tövsiyə olunur. Aşağıdakı nümunə funksiya bu prosesi tam şəkildə əhatə edir:
Kod:
<?php
/**
* Xarici JSON API-dən məlumatları təhlükəsiz şəkildə çəkir.
*
* @param string $url API endpoint URL-i.
* @param array $headers Göndəriləcək əlavə HTTP başlıqları.
* @return array|null Çəkilmiş JSON məlumatı assosiativ massiv kimi, xəta olarsa null.
* @throws JsonException JSON dekodlaşdırma xətası baş verdikdə.
*/
function fetchJsonFromApi(string $url, array $headers = []): ?array
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Cavabı string olaraq geri qaytar
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 10 saniyəlik timeout
curl_setopt($ch, CURLOPT_HTTPHEADER, array_merge([
'Accept: application/json',
'Content-Type: application/json'
], $headers));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // SSL sertifikatını yoxla
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // Host adını yoxla (PHP 5.4.0-dan sonra 2 doğru qiymətdir)
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (curl_errno($ch)) {
$errorMsg = curl_error($ch);
curl_close($ch);
error_log("cURL xətası: {$errorMsg} (URL: {$url})");
return null;
}
curl_close($ch);
if ($httpCode >= 400) {
error_log("API xətası: HTTP Status {$httpCode} (URL: {$url}, Cavab: {$response})");
return null;
}
// JSON dekodlaşdırma xətalarını idarə etmək üçün JSON_THROW_ON_ERROR istifadə edin (PHP 7.3+)
try {
$data = json_decode($response, true, 512, JSON_THROW_ON_ERROR);
return $data;
} catch (JsonException $e) {
error_log("JSON dekodlaşdırma xətası: {$e->getMessage()} (URL: {$url}, Cavab: {$response})");
throw $e; // Xətanı yuxarı səviyyəyə ötür ki, tətbiq onu idarə edə bilsin
}
}
// Nümunə istifadə:
try {
$api_url = "https://jsonplaceholder.typicode.com/todos/1"; // Nümunə API endpoint-i
$data = fetchJsonFromApi($api_url);
if ($data !== null) {
echo "[B]API-dən alınan məlumat:[/B]\n";
print_r($data);
} else {
echo "[I]Məlumat çəkilmədi və ya xəta baş verdi. Logları yoxlayın.[/I]\n";
}
// Başlıq əlavə etməklə nümunə (məsələn, autentifikasiya üçün):
// $headers = ['Authorization: Bearer SİZİN_TOKENİNİZ'];
// $secured_data = fetchJsonFromApi("https://api.example.com/secured_endpoint", $headers);
} catch (JsonException $e) {
echo "[B]JSON Dekodlaşdırma Xətası:[/B] " . $e->getMessage() . "\n";
}
?>
Məntiqi Əsaslandırma:
Bu yanaşma bir neçə əsas üstünlüyə malikdir:
- Təhlükəsizlik:
CURLOPT_SSL_VERIFYPEERvəCURLOPT_SSL_VERIFYHOSTseçimləri man-in-the-middle hücumlarının qarşısını almaq üçün SSL sertifikatının yoxlanılmasını təmin edir. Köhnəfile_get_contentsüsulu bu səviyyədə nəzarəti təmin etmir və çox vaxt təhlükəsizlik boşluqlarına səbəb olur. - Etibarlı Xəta İdarəetməsi:
curl_errno,curl_getinfovəJSON_THROW_ON_ERRORilə HTTP səviyyəsində və JSON dekodlaşdırma səviyyəsində bütün mümkün xətalar düzgün şəkildə idarə olunur.