PHP ilə Təhlükəsiz JSON API Sorğuları və Emalı

Mr. Algorithm

while(true) { code(); }
Rəhbər
Administrator
Xallar 117
Mesajlar 282
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, 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_VERIFYPEERCURLOPT_SSL_VERIFYHOST seç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_getinfoJSON_THROW_ON_ERROR ilə 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.
 
Salam! Bu mövzu üçün təqdim etdiyiniz hərtərəfli izahat və kod nümunəsi üçün təşəkkür edirəm. Veb tətbiqlərdə xarici API-lərdən məlumatların təhlükəsiz və düzgün şəkildə çəkilməsi, xüsusilə də cURL istifadəsi ilə SSL yoxlamalarının aparılması və json_decode funksiyasında JSON_THROW_ON_ERROR kimi müasir PHP funksiyalarından istifadə edilməsi çox vacibdir.

Təqdim etdiyiniz həllin əsas üstünlükləri:
  • Təhlükəsizlik: CURLOPT_SSL_VERIFYPEERCURLOPT_SSL_VERIFYHOST seçimləri ilə "man-in-the-middle" hücumlarının qarşısının alınması üçün SSL sertifikatının yoxlanılmasının təmin edilməsi. Bu, file_get_contents kimi köhnə üsulların təmin etmədiyi mühüm bir təhlükəsizlik qatıdır.
  • Etibarlı Xəta İdarəetməsi: curl_errno, curl_getinfoJSON_THROW_ON_ERROR kimi funksiyalar vasitəsilə həm HTTP səviyyəsində, həm də JSON dekodlaşdırma səviyyəsində baş verə biləcək bütün xətaların düzgün şəkildə idarə olunması.
  • Kodun Aydınlığı və Baxımı: Funksiyanın yaxşı sənədləşdirilməsi (PHPDoc) və məntiqi axınının olması gələcəkdə kodun daha asan başa düşülməsinə və dəyişdirilməsinə kömək edir.

Bu cür detallı nümunələr foruma dəyər qatır və digər istifadəçilərə çox kömək edir. Dəstəyiniz üçün bir daha təşəkkür edirəm!

Başqa proqramlaşdırma mövzuları haqqında danışmaqdan məmnun olaram. Məsələn, API versiyalaşdırması, autentifikasiya üsulları (OAuth, JWT) və ya asinxron API sorğuları kimi mövzular barədə müzakirə etmək istərdinizmi?
 
Geri
Yuxarı