PHP API: Konsumowanie API z wykorzystaniem

Konsumowanie API w PHP

Programując w PHP pewnie nie raz przyjdzie Ci skorzystać z zewnętrznego API, by pobrać dane do Twojego systemu lub zsynchronizować je z systemem zewnętrznym.

Wiesz jak to zrobić?

Można to osiągnąć na kilka sposobów – bardziej i mniej czasochłonnych. W tym artykule dowiesz się, jak wykorzystać bibliotekę GuzzleHTTP, by w sposób bardzo cywilizowany korzystać z API.

Zanim zaczniemy…

Czym tak naprawdę jest API?

API (czyli z ang. Application Programming Interface) to warstwa oprogramowania pośrednicząca w komunikacji między dwoma systemami informatycznymi.

Można powiedzieć, że to taki interfejs dla programistów, przy pomocy którego mogą wejść w interakcję z danymi Twojego systemu. Podobnie jak ludzie odwiedzający Twoją stronę internetową mają warstwę wizualną, w którą klikają.

Mając dostępne API, w ogóle nie musisz wchodzić w interakcję w interfejsem wizualnym strony, by uzyskać od niej informacje czy przekazać dane. Jest to dużo bardziej efektywne podejście – znacznie szybsze i oszczędzające transfer dla obu stron.

Przykładami ogólnodostępnych API są np. CoinGecko API (do pobierania aktualnych danych o krypto-walutach) czy API Narodowego Banku Polskiego (NBP) do pobierania aktualnych kursów walut i kruszców.

Z API NBP korzystamy w kursie Laravel od A do Z, gdzie również omawiany jest GuzzleHTTP.

Instalacja GuzzleHTTP w projekcie

Żeby zainstalować GuzzleHTTP w projekcie, wystarczy, że skorzystasz z Composera i wykonasz następującą komendę:

composer require guzzlehttp/guzzle

Po tym będziesz w stanie zaimportować namespace GuzzleHttp\Client i korzystać z klienta do odpytywania serwisów zewnętrznych.

Przykład klasy korzystającej z tego podejścia wygląda tak:

<?php

namespace App\Services;

use GuzzleHttp\Client;

class ApiService
{
    public function getExample()
    {
    }
}

Przykład zapytania GET przez API

Napiszmy sobie teraz bardzo proste zapytanie GET pobierające dane o 7 top tokenach, które najwięcej zyskały na wartości w ciągu ostatnich 24 godzin.

Coingecko API posiada metodę o nazwie trending, z której skorzystamy:

<?php

namespace App\Services;

use GuzzleHttp\Client;

class ApiService
{
    public function getTokens()
    {
        $client = new Client();

        $response = $client->request('GET', 'https://api.coingecko.com/api/v3/search/trending', [
            'headers' => [
                'accept' => 'application/json',
            ]
        ]);

        if ($response->getStatusCode() == 200)
        {
            $content = json_decode($response->getBody());
            var_dump($content);
        }
    }

Tutaj musisz pamiętać o kilku rzeczach:

  • podanie prawidłowej metody zapytania (GET),
  • podanie adresu, który chcemy odpytać,
  • ustawienie nagłówka accept i podania oczekiwanego formatu odpowiedzi (zazwyczaj application/json)
  • następnie, jeśli otrzymany status wynosi 200 (czyli SUKCES) to odczytujemy ciało odpowiedzi i dekodujemy JSON.

Polecam spróbować 🙂

Zapytanie POST i dodawanie autoryzacji tokenem

Poza prostymi zapytaniami GET, możesz również przekazywać dane do zewnętrznego systemu (metodami POST czy PUT) oraz autoryzować się kluczem API lub Access Tokenem.

Akurat coingecko oferuje jedynie zapytania GET, jednak przykładem innego API, z którego sam korzystam, jest API InFaktu.

InFakt to aplikacja do samodzielnej, bezproblemowej księgowości (jeśli chcesz założyć konto ze zniżką 10%, skorzystaj z mojego polecenia: https://www.infakt.pl/polecam/marcin-wesel).

Jestem ambasadorem InFaktu i szczerze polecam – nie zawiódł mnie od 8 lat. Przejdźmy jednak do spraw związanych z API.

InFakt pozwala wygenerować klucz API, który umożliwi dostęp do zasobów aplikacji w Twoim imieniu. Traktuj go jako bardzo wrażliwą daną! Z jego wykorzystaniem ktoś mógłby wyczyścić wszystkie Twoje dane o fakturach i księgowości.

Przykład tworzenia nowego klienta przez API InFakt w systemie (z wykorzystaniem GuzzleHTTP):

public function postCustomer()
    {
        $client = new Client();

        $response = $client->request('POST', 'https://api.infakt.pl/v3/clients.json', [
            'headers' => [
                'accept' => 'application/json',
                'X-inFakt-ApiKey' => 'eee06c6f766520496e66616b74203a3e'
            ],
            'body' => '{"client":{"company_name":"Twoja Firma Sp. z o.o."}}'
        ]);

        return $response->getStatusCode() == 201;
    }

W podobny sposób możesz edytować dane już istniejącego klienta. Wtedy, zamiast metody POST, wykorzystasz metodę PUT.

Autoryzacja Access Tokenem (oAuth2)

Podam jeszcze jeden krótki przykład, który jest bardzo powszechny w dzisiejszym świecie IT. Chodzi o autoryzację w protokole oAuth2.

Czyli, po poprawnym zalogowaniu się, otrzymujesz Access Token o ograniczonym terminie ważności (np. 30 minut). Każde zapytanie wykonane w ciągu tych 30 minut, z wykorzystaniem tokena, będzie traktowane jako autoryzowane przez użytkownika.

Bardzo szerokie wykorzystanie tej metody znajdziesz np. w aplikacjach typu SPA lub mobilnych, gdzie serwer odpowiada za rozpoznanie i przetworzenie poświadczeń użytkownika, a aplikacja frontendowa służy tylko jako „pośrednik”.

Wtedy, po zalogowaniu się, do naszego zapytania (obojętnie, jaką metodą HTTP) dodajemy nagłówek:

<?php

// ...
            'headers' => [
                'accept' => 'application/json',
                'authorization' => 'Bearer asdjoASDyhsn21asnd2MYF0xJ3pTvsgbxCi2ZcqG'
            ],

Gdzie do nagłówka authorization dodajemy słówko Bearer (czyli posiadacz) i po spacji wstawiamy otrzymany access token.

Podsumowanie API w PHP

To wszystko, co chciałem Ci pokazać w tym krótkim artykule na temat konsumowania API przez PHP.

Być może chcesz, żebym uzupełnił przykłady o jakieś sytuacje z Twojego podwórka? Daj znać w komentarzu, chętnie pomogę.