Jak korzystać z Guzzle — klienta PHP HTTP do wysyłania żądań HTTP
Deweloper zawsze napotyka zadanie, w którym musi wysyłać żądania HTTP do innych zasobów i obsługiwać odpowiedź. Popularnym sposobem wykonywania tych zadań jest użycie cURL. Jednak korzystanie z cURL nie jest stosunkowo łatwe dla początkującego. Aby napisać skrypt w cURL, twój serwer powinien mieć włączone rozszerzenie cURL.
Guzzle jest alternatywą dla cURL. Jest to klient PHP HTTP, który ułatwia wysyłanie żądań HTTP i trywialny do integracji z usługami sieciowymi. Nawet z mojego doświadczenia mogę powiedzieć, że Guzzle jest lepszy niż cURL. Jest prosty i łatwy w użyciu. Jeśli używasz Guzzle, nie musisz mieć rozszerzenia cURL na swoim serwerze. Daje lepsze formatowanie kodu w porównaniu do cURL.
Biorąc to pod uwagę, zobaczmy, jak używać Guzzle w twojej aplikacji.
Instalacja
Zalecanym sposobem instalacji Guzzle jest użycie Kompozytora. Jeśli nie zainstalowałeś Composera w swoim systemie, możesz go pobrać stąd.
Otwórz terminal w katalogu głównym projektu i uruchom poniższe polecenie, aby zainstalować Guzzle.
composer require guzzlehttp/guzzle
Guzzle zapewnia obsługę wszystkich żądań HTTP, takich jak GET, DELETE, HEAD, OPTIONS, PATCH, POST i PUT. W tym samouczku uczymy się, jak używać Guzzle do wysyłania żądań HTTP i obsługi za jego pomocą odpowiedzi.
Jako przykład biorę usługę REQ|RES, która zapewnia fałszywe prawdziwe API do testowania żądań HTTP.
Jak wysłać żądanie HTTP za pomocą Guzzle
Po zainstalowaniu biblioteki Guzzle musisz dołączyć do swojego pliku środowisko Guzzle w następujący sposób.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
Teraz wypróbujmy kilka operacji jedna po drugiej, takich jak GET, POST, przesyłanie pliku, skopiuj plik ze zdalnego adresu URL do katalogu lokalnego, PUT, PATCH i DELETE.
POBIERZ żądanie za pomocą Guzzle
Jeśli spojrzysz na stronę REQ|RES, znajdziesz tam kilka punktów końcowych dla żądań „GET". Posłużę się przykładem punktu końcowego „LISTA UŻYTKOWNIKÓW”. Aby uzyskać listę użytkowników, proszą o wysłanie żądania GET do tego punktu końcowego https://reqres.in/api/users?page=2.
W Guzzle wyślemy to żądanie GET w następujący sposób.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'https://reqres.in',
]);
$response = $client->request('GET', '/api/users', [
'query' => [
'page' => '2',
]
]);
//get status code using $response->getStatusCode();
$body = $response->getBody();
$arr_body = json_decode($body);
print_r($arr_body);
Najpierw wyodrębniłem „base_uri” (wspólny adres URL) jako https://reqres.in. Tutaj końcowy punkt końcowy to „/api/users” i wymaga parametru GET jako „page”. W Guzzle możesz wysyłać parametry GET za pomocą tablicy ‘query’, jak pokazano w powyższym kodzie.
Żądanie POST przy użyciu Guzzle
Zwykle istnieją 2 rodzaje żądań POST. Może być konieczne podanie parametrów POST jako żądania POST „application/x-www-form-urlencoded” lub przesłanie danych zakodowanych w formacie JSON jako treści żądania. Możesz publikować dane zakodowane w formacie JSON, jak pokazano poniżej.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'https://reqres.in',
]);
$response = $client->request('POST', '/api/users', [
'json' => [
'name' => 'Sam',
'job' => 'Developer'
]
]);
//get status code using $response->getStatusCode();
$body = $response->getBody();
$arr_body = json_decode($body);
print_r($arr_body);
W przypadku żądania POST „application/x-www-form-urlencoded” parametry POST można wykonać w następujący sposób.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'BASE_URL_ENDPOINT',
]);
$client->request('POST', '/endpoint_here', [
'form_params' => [
'foo' => 'bar',
'baz' => ['hi', 'there!']
]
]);
W niektórych przypadkach punkty końcowe interfejsu API proszą o przesłanie tokena autoryzacji w każdym żądaniu HTTP. Użytkownik może wysłać ten token jako nagłówki w żądaniu Guzzle.
<?php
$client->request('POST', '/endpoint_here', [
"headers" => [
"Authorization" => "Bearer TOKEN_VALUE"
],
'form_params' => [
'foo' => 'bar',
'baz' => ['hi', 'there!']
]
]);
Skopiuj plik ze zdalnego serwera za pomocą Guzzle
Jeśli chcesz skopiować plik ze zdalnego serwera do lokalnego katalogu, Guzzle będzie lepszym rozwiązaniem. Załóżmy, że chcesz skopiować ten obraz ze strony https://artisansweb.net/wp-content/uploads/2020/03/blog.jpg jako „blog.jpg” do lokalnego katalogu. Napiszemy dla niego kod, jak pokazano poniżej.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
$fp = fopen('blog.jpg', 'wb');
$client = new GuzzleHttpClient();
$request = $client->get('https://artisansweb.net/wp-content/uploads/2020/03/blog.jpg', ['sink' => $fp]);
fclose($fp);
Przesyłanie plików za pomocą Guzzle
Jak wszyscy wiemy, aby przesłać pliki, musimy ustawić treść żądania na formularz ‘multipart/form-data’. Podstawowy kod w Guzzle do przesyłania plików byłby napisany jak poniżej.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'BASE_URL_HERE',
]);
$client->request('POST', '/endpoint_here', [
'multipart' => [
[
'name' => 'files', // name value requires by endpoint
'contents' => fopen('/path/to/file', 'r'),
'filename' => 'custom_image.jpg'
],
]
]);
Aby zademonstrować przesyłanie pliku, wezmę przykład na żywo API reSmush.it, który w odpowiedzi wysyła zoptymalizowaną wersję obrazu. Musisz POSTować swój obraz do punktu końcowego. Kod do niego przy użyciu Guzzle w następujący sposób.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
try {
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'http://api.resmush.it',
]);
$response = $client->request('POST', "?qlty=92", [
'multipart' => [
[
'name' => 'files', // name value requires by endpoint
'contents' => fopen(getcwd().'/blog.jpg', 'r'),
'filename' => 'blog.jpg',
'headers' => array('Content-Type' => mime_content_type(getcwd().'/blog.jpg'))
]
]
]);
if (200 == $response->getStatusCode()) {
$response = $response->getBody();
$arr_result = json_decode($response);
print_r($arr_result);
}
} catch (Exception $e) {
echo $e->getMessage();
}
Żądanie PUT, PATCH i DELETE za pomocą Guzzle
Żądania PUT i PATCH są używane do aktualizacji zasobów. Jednak te 2 prośby robią to inaczej.
PUT zastępuje całą jednostkę, jeśli już istnieje, i tworzy nowy zasób, jeśli nie istnieje. Jeśli chcesz zaktualizować imię i nazwisko osoby, podczas składania żądania PUT musisz przesłać cały zasób.
<?php
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'https://reqres.in',
]);
$response = $client->request('PUT', '/api/users/2', [
'json' => [
'name' => 'Sam',
'job' => 'Developer'
]
]);
//get status code using $response->getStatusCode();
$body = $response->getBody();
$arr_body = json_decode($body);
print_r($arr_body);
Żądanie PATCH stosuje częściową aktualizację zasobu. Oznacza to, że musisz wysłać tylko dane, które chcesz zaktualizować, i nie wpłynie to na nic innego. Jeśli więc chcesz zaktualizować imię i nazwisko osoby, wystarczy przesłać parametr name.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'https://reqres.in',
]);
$response = $client->request('PATCH', '/api/users/2', [
'json' => [
'name' => 'Sam',
]
]);
//get status code using $response->getStatusCode();
$body = $response->getBody();
$arr_body = json_decode($body);
print_r($arr_body);
Żądanie DELETE jest proste. Musisz tylko trafić w punkt końcowy w następujący sposób.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'https://reqres.in',
]);
$response = $client->request('DELETE', '/api/users/2');
echo $response->getStatusCode(); //should gives 204
Mam nadzieję, że poznałeś Guzzle i podstawy, jak go używać. Możesz przeczytać więcej o opcjach Guzzle Request w ich dokumentacji. Podziel się swoimi przemyśleniami lub sugestiami w sekcji komentarzy poniżej.
Powiązane artykuły
- YouTube API – jak uzyskać listę filmów z YouTube na swoim kanale
- TinyPNG Kompresuj obrazy za pomocą PHP
- Walidacja formularza HTML za pomocą pietruszki