W tym opracowaniu przyjrzymy się różnorodnym klientom PHP, które umożliwiają komunikację z interfejsem API platformy newsblog.pl.
Szczególną uwagę poświęcimy wykorzystaniu API newsblog.pl za pomocą funkcji `file_get_contents`, biblioteki Guzzle, narzędzia HTTPful oraz klienta HTTPS w ramach Symfony.
Czym jest API newsblog.pl?
newsblog.pl oferuje bezpłatny pakiet narzędzi, dzięki którym można analizować efektywność swojej strony internetowej. W skład tych narzędzi wchodzą między innymi: skaner nieaktywnych linków, miernik czasu ładowania oraz moduł sprawdzania DNS. Dostęp do tych funkcji jest możliwy zarówno poprzez przeglądarkę internetową, jak i za pośrednictwem interfejsu API.
Interfejs API bazuje na protokole HTTP i jest dostępny dla wszystkich języków programowania posiadających biblioteki klienta HTTP. API oferuje także darmowy plan, dzięki któremu można rozpocząć pracę bez konieczności podawania danych płatniczych.
Co zbudujemy?
Stworzymy skrypt uruchamiany z linii poleceń, który zmierzy czas potrzebny na załadowanie strony Google, a następnie wyświetli ten wynik w konsoli. W tym celu wykorzystamy różne klienty HTTP dla PHP, aby zaprezentować, jak praktycznie korzystać z API.
Wykorzystamy do tego wbudowane funkcje takie jak `file_get_contents()` i `php_curl`, a także zewnętrzną bibliotekę Guzzle. Chociaż przykłady te są proste, dobrze ilustrują fundamenty korzystania z API newsblog.pl.
Wymagania wstępne
Do dalszej pracy potrzebna jest podstawowa wiedza z zakresu PHP oraz zainstalowane środowisko PHP na komputerze. Dodatkowo, do zarządzania rozszerzeniami, niezbędny będzie Composer.
Niezbędny będzie również edytor tekstu. W moim przypadku używam Visual Studio Code, popularnego edytora open-source od Microsoft. Można go pobrać ze strony Visual Studio Code.
Przegląd API newsblog.pl
API newsblog.pl udostępnia szereg punktów końcowych, zależnych od tego, jaką funkcję chcemy wywołać. Dokładna lista punktów końcowych wraz z dokumentacją znajduje się na stronie dokumentacji.
Zakładanie konta newsblog.pl
Aby zacząć korzystać z API, konieczne jest założenie konta na stronie docelowej API poprzez kliknięcie przycisku rejestracji. Po rejestracji, zostaniemy przekierowani do panelu użytkownika, gdzie znajdziemy nasz klucz API. Panel powinien wyglądać podobnie jak na poniższym obrazku. Mój klucz API został zamaskowany dla bezpieczeństwa.
Każde żądanie do API musi zawierać ten klucz w nagłówku. Wkrótce pokażemy, jak to zrobić.
Po założeniu konta newsblog.pl i instalacji PHP, możemy rozpocząć tworzenie naszego projektu.
Tworzenie folderu projektu
W pierwszym kroku stwórz folder na pliki projektu. Wewnątrz utwórz następujące pliki:
- .env
- with_curl.php
- with_file_get_contents.php
- with_guzzle.php
Następnie, za pomocą poniższej komendy, zainstaluj rozszerzenia `vlucas/phpdotenv` i `guzzlehttp/guzzle`:
composer require vlucas/phpdotenv guzzlehttp/guzzle
W tym momencie, struktura folderu powinna wyglądać następująco:
Otwórz plik `.env` i dodaj poniższy wiersz, zastępując `
API_KEY=<your-api-key>
Wykorzystanie funkcji `file_get_contents()`
Pierwszą metodą tworzenia żądań HTTP, jaką omówimy, jest wykorzystanie wbudowanej w PHP funkcji `file_get_contents()`. Sygnatura tej funkcji wygląda następująco:
file_get_contents(path, include_path, context)
Chociaż ta metoda jest często stosowana do odczytywania plików z dysku lokalnego, możemy jej użyć również do pobierania danych z zasobów sieciowych, takich jak dane zwracane przez API.
Aby zacząć, otwórz plik `with_file_get_contents.php` i dodaj standardowy kod PHP:
<?php // tutaj zostanie umieszczony kod ?>
Następnie załaduj niezbędne rozszerzenia, dodając następujący wiersz:
require_once('vendor/autoload.php');
Potem załaduj nasze zmienne środowiskowe, w tym klucz API:
$dotenv = DotenvDotenv::createImmutable(__DIR__); $dotenv->load();
Następnie zdefiniujmy ładunek, czyli dane, które wyślemy w treści żądania:
$payload = json_encode([ "url" => "https://www.google.com", "proxyCountry" => "us", "followRedirect" => true ]);
Stworzyliśmy zmienną `$payload` i przypisaliśmy do niej ciąg JSON zawierający właściwości `url`, `proxyCountry` i `followRedirect`.
Właściwość `url` określa adres strony, której czas ładowania chcemy sprawdzić.
`proxyCountry` to lokalizacja serwera, który będzie wysyłał nasze żądanie. W tym przypadku używamy serwera w USA, ale do wyboru mamy również serwery w Indiach, Chinach, Wielkiej Brytanii i Francji. Szczegóły znajdują się w dokumentacji API.
`followRedirect` określa, czy serwer proxy powinien śledzić przekierowania i mierzyć czas odpowiedzi ostatniego przekierowania, czy pierwszego.
Kolejnym krokiem jest konfiguracja opcji, które zdefiniują nasze żądanie. Dodajmy następujący kod:
$options = [ "http" => [ "method" => "POST", "header" => array("Content-Type: application/json", "x-api-key : " . $_ENV['API_KEY']), "content" => $payload ] ];
Utworzyliśmy obiekt `$options`, który mówi, że używamy metody HTTP `POST`. Mamy też nagłówek, który zawiera dwie właściwości: typ zawartości jako JSON oraz `x-api-key` z kluczem API załadowanym ze zmiennej środowiskowej.
Teraz możemy utworzyć strumień, do którego zostaną zapisane nasze opcje:
$context = stream_context_create($options);
Wywołajmy funkcję `file_get_contents()`, aby wykonać żądanie i zapisać odpowiedź do zmiennej:
$response = file_get_contents("https://api.newsblog.pl.com/loadtime", false, $context);
Wysłaliśmy żądanie na adres `https://api.newsblog.pl.com/loadtime`. Argument `false` informuje PHP, aby nie używał ścieżki, a `$context` to utworzony przez nas kontekst.
Na koniec wyświetlmy odpowiedź:
echo "Loadtime: " . json_decode($response)->data->total . "n";
Kompletny kod pliku powinien wyglądać następująco:
<?php require_once('vendor/autoload.php'); $dotenv = DotenvDotenv::createImmutable(__DIR__); $dotenv->load(); $payload = json_encode([ "url" => "https://www.google.com", "proxyCountry" => "us", "followRedirect" => true ]); $options = [ "http" => [ "method" => "POST", "header" => array("Content-Type: application/json", "x-api-key : " . $_ENV['API_KEY']), "content" => $payload ] ]; $context = stream_context_create($options); $response = file_get_contents("https://api.newsblog.pl.com/loadtime", false, $context); echo "Loadtime: " . json_decode($response)->data->total . "n"; ?>
Po uruchomieniu skryptu za pomocą komendy:
php with_file_get_contents.php
Otrzymamy następujący wynik:
Loadtime: 81
Wykorzystanie cURL
cURL to narzędzie służące do wysyłania żądań URL po stronie klienta z poziomu linii poleceń. W PHP możemy z niego korzystać za pomocą biblioteki `php-curl`. Aby zacząć, otwórz plik `with_curl.php` i dodaj bazowy kod PHP:
<?php // tutaj wpiszemy nowy kod ?>
Następnie zaimportujmy rozszerzenia i zmienną środowiskową `API_KEY` zdefiniowaną w pliku `.env`:
require_once('vendor/autoload.php'); $dotenv = DotenvDotenv::createImmutable(__DIR__); $dotenv->load();
Utwórzmy zmienną do przechowywania nagłówków żądania jako tablicy, gdzie każdy element tablicy jest oddzielnym nagłówkiem:
$header = ["Content-type: application/json", "x-api-key: " . $_ENV['API_KEY']];
Zdefiniowaliśmy dwa nagłówki: typ zawartości i klucz API.
Następnie zdefiniujmy treść żądania:
$body = json_encode([ "url" => "google.com", "proxyCountry" => "us", "followRedirect" => true ]);
Teraz stwórzmy sesję curl za pomocą funkcji `curl_init()`, gdzie jako argument przekazujemy adres URL:
$ch = curl_init("https://api.newsblog.pl.com/loadtime");
Teraz możemy złożyć wszystko razem, definiując nagłówek i treść jako opcje sesji, za pomocą funkcji `curl_setopt_array()`:
curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_HTTPHEADER => $header, CURLOPT_POSTFIELDS => $body ]);
Aby wykonać żądanie, wywołajmy funkcję `curl_exec()`:
$response = curl_exec($ch);
Odpowiedź zapisaliśmy w zmiennej `$response`, więc możemy zamknąć sesję i zwolnić zasoby systemu za pomocą `curl_close()`:
curl_close($ch);
Na koniec wyświetlmy odpowiedź za pomocą `var_dump()`:
var_dump($response);
Ostateczna wersja skryptu powinna wyglądać następująco:
<?php require_once('vendor/autoload.php'); $dotenv = DotenvDotenv::createImmutable(__DIR__); $dotenv->load(); $header = ["Content-type: application/json", "x-api-key: " . $_ENV['API_KEY']]; $body = json_encode([ "url" => "google.com", "proxyCountry" => "us", "followRedirect" => true ]); $ch = curl_init("https://api.newsblog.pl.com/loadtime"); curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_HTTPHEADER => $header, CURLOPT_POSTFIELDS => $body ]); $response = curl_exec($ch); curl_close($ch); var_dump($response); ?>
Po uruchomieniu skryptu za pomocą `php with_curl.php`, otrzymamy następujący wynik:
{"timestamp":1666083632547,"apiStatus":"success","apiCode":200,"meta":{"url":"google.com","followRedirect":true,"redirectedURL":"https://www.google.com/?gws_rd=ssl","test":{"id":"d20h1hb409qbfwm0g534l51asugpi5hl"}},"data":{"dns":12,"connect":17,"tls":6,"send":21,"wait":110,"total":114}}bool(true)
Żądanie zakończyło się pomyślnie, a API zwróciło dane w formacie JSON. Możemy z nimi dalej pracować.
Wykorzystanie Guzzle
W ostatniej części samouczka użyjemy Guzzle do napisania skryptu. Jak zwykle, zaczynamy od dodania szablonu PHP do pliku `with_guzzle.php`:
<?php // cały kod będzie tutaj ?>
Następnie zaimportujmy rozszerzenia, klienta Guzzle i obiekty żądania, a także załadujmy zmienne środowiskowe:
require_once('vendor/autoload.php'); use GuzzleHttpClient; use GuzzleHttpPsr7Request;
Następnie załadujmy zmienne środowiskowe:
$dotenv = DotenvDotenv::createImmutable(__DIR__); $dotenv->load();
Teraz utwórzmy instancję klienta HTTP Guzzle:
$client = new GuzzleHttpClient();
Kolejnym krokiem jest utworzenie nagłówków żądania:
$headers = [ 'x-api-key' => $_ENV['API_KEY'], 'Content-Type' => 'application/json' ];
Następnie zdefiniujmy treść żądania:
$body = json_encode([ "url" => "google.com", "proxyCountry" => "us", "followRedirect" => true ]);
Teraz możemy wykonać żądanie, tworząc instancję klasy `Request` i przekazując do niej adres URL punktu końcowego API, nagłówki i treść:
$request = new Request('POST', 'https://api.newsblog.pl.com/loadtime', $headers, $body);
Aby wysłać żądanie, dodajmy następujący wiersz:
$response = $client->sendAsync($request)->wait();
Po wysłaniu żądania możemy pobrać jego treść:
$response_body = $response->getBody();
Na koniec możemy zdekodować odpowiedź JSON i wyświetlić czas ładowania:
echo "Loadtime: " . json_decode($response_body)->data->total . "n";
Kompletny kod pliku powinien wyglądać następująco:
<?php require_once('vendor/autoload.php'); use GuzzleHttpClient; use GuzzleHttpPsr7Request; $dotenv = DotenvDotenv::createImmutable(__DIR__); $dotenv->load(); $client = new GuzzleHttpClient(); $headers = [ 'x-api-key' => $_ENV['API_KEY'], 'Content-Type' => 'application/json' ]; $body = json_encode([ "url" => "google.com", "proxyCountry" => "us", "followRedirect" => true ]); $request = new Request('POST', 'https://api.newsblog.pl.com/loadtime', $headers, $body); $response = $client->sendAsync($request)->wait(); $response_body = $response->getBody(); echo "Loadtime: " . json_decode($response_body)->data->total . "n"; ?>
Po uruchomieniu skryptu za pomocą komendy:
$php with_guzzle.php
Otrzymamy odpowiedź:
Loadtime: 130
Podsumowanie
W tym artykule omówiliśmy różnych klientów, których można użyć do budowy projektów PHP korzystających z interfejsu API newsblog.pl.
Chociaż skrypty w tym projekcie wykorzystują linię poleceń jako podstawowe źródło danych wyjściowych, rzeczywiste projekty mogą prezentować odpowiedź na stronie internetowej lub zapisywać ją w pliku. Przykładowe skrypty były uproszczone, ale pokazały podstawowe zasady korzystania z API newsblog.pl. Aby wykorzystać inne punkty końcowe, wystarczy zmienić adres URL i przekazywać odpowiednie opcje w treści żądania.
Może Cię także zainteresować, jak wykorzystać API newsblog.pl do wyszukiwania DNS w JavaScript.