Hur man använder Guzzle – En PHP HTTP-klient för att skicka HTTP-förfrågningar
Utvecklaren stöter alltid på en uppgift där de behöver skicka HTTP-förfrågningar till andra resurser och hantera svaret. Det populära sättet att utföra dessa uppgifter är att använda en cURL. Att använda cURL är dock inte relativt lätt för en nybörjare. Även för att skriva ett skript i cURL borde din server ha aktiverat cURL-tillägget.
Guzzle är ett alternativ till cURL. Det är en PHP HTTP-klient som gör det enkelt att skicka HTTP-förfrågningar och trivialt att integrera med webbtjänster. Till och med kan jag säga från min erfarenhet att Guzzle är bättre än cURL. Det är enkelt och lätt att använda. Om du använder Guzzle behöver du inte ha cURL-tillägg på din server. Det ger dig bättre formatering av kod jämfört med cURL.
Med det sagt, låt oss se hur man använder Guzzle i din applikation.
Installation
Det rekommenderade sättet att installera Guzzle är via Composer. Om du inte har installerat Composer på ditt system kan du hämta det härifrån.
Öppna terminalen i din projektkatalog och kör kommandot nedan för att installera Guzzle.
composer require guzzlehttp/guzzle
Guzzle ger stöd för alla HTTP-förfrågningar som är GET, DELETE, HEAD, ALTERNATIV, PATCH, POST och PUT. I den här handledningen studerar vi hur man använder Guzzle för att skicka HTTP-förfrågningar och hantera svar med det.
Som ett exempel tar jag REQ | RES- tjänsten som ger ett falskt riktigt API för att testa HTTP-förfrågningar.
Hur man skickar HTTP-begäran med Guzzle
Efter installationen av Guzzle-biblioteket måste du inkludera en Guzzle-miljö i din fil enligt följande.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
Låt oss nu prova några operationer en efter en som GET, POST, File upload, kopiera fil från fjärr-URL till en lokal katalog, PUT, PATCH och DELETE.
FÅ begäran med Guzzle
Om du tittar på webbplatsen REQ | RES gav de några slutpunkter för "GET" -förfrågningar. Jag tar exemplet med ‘LIST USERS’ slutpunkt. För att få användarlistan ber de att skicka en GET-begäran till denna slutpunkt https://reqres.in/api/users?page=2.
I Guzzle skickar vi denna GET-begäran enligt följande.
<?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);
Först extraherade jag en ‘base_uri’ (gemensam URL) som https://reqres.in. Här är den slutliga slutpunkten ‘/ api / användare’ och det kräver en GET-parameter som ‘sida’. I Guzzle kan du skicka GET-parametrar med hjälp av ‘query’ -matrisen som visas i ovanstående kod.
POST-begäran med Guzzle
Normalt finns det två typer av POST-förfrågningar. Du kan behöva POST-parametrar som ‘application / x-www-form-urlencoded’ POST-begäran eller ladda upp JSON-kodad data som en del av begäran. Du kan skicka JSON-kodad data enligt nedan.
<?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);
I fallet med ‘application / x-www-form-urlencoded’ POST-begäran kan du POST-parametrar enligt följande.
<?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!']
]
]);
I vissa fall ber API-slutpunkter dig att skicka auktoriseringstoken i varje HTTP-begäran. Användaren kan skicka denna token som rubriker i din Guzzle-begäran.
<?php
$client->request('POST', '/endpoint_here', [
"headers" => [
"Authorization" => "Bearer TOKEN_VALUE"
],
'form_params' => [
'foo' => 'bar',
'baz' => ['hi', 'there!']
]
]);
Kopiera fil från fjärrservern med Guzzle
Om du vill kopiera en fil från en fjärrserver till din lokala katalog är Guzzle ett bättre alternativ. Låt oss säga att du vill kopiera den här bilden på https://artisansweb.net/wp-content/uploads/2020/03/blog.jpg som ‘blog.jpg’ till din lokala katalog. Vi skriver koden för det enligt nedan.
<?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);
Filöverföring med Guzzle
Som vi alla vet måste vi för att ladda upp filer ställa in förfrågan till ett "multipart / form-data" -formulär. Grundkoden i Guzzle för överföring av filer skulle skrivas enligt nedan.
<?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'
],
]
]);
För att demonstrera filöverföringen tar jag ett liveexempel på reSmush.it API som skickar en optimerad version av bilden som svar. Du måste POSTA din bild till deras slutpunkt. Koden för det med hjälp av Guzzle enligt följande.
<?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();
}
PUT, PATCH och DELETE Begäran med Guzzle
PUT- och PATCH-förfrågningarna används för att uppdatera resurserna. Dessa två förfrågningar gör det dock annorlunda.
PUT skriver över hela enheten om den redan finns och skapar en ny resurs om den inte finns. Om du vill uppdatera namnet på en person måste du skicka hela resursen när du gör en PUT-begäran.
<?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);
PATCH-begäran tillämpar en delvis uppdatering av resursen. Det betyder att du bara måste skicka de data som du vill uppdatera, och det påverkar inte eller förändrar något annat. Så om du vill uppdatera namnet på en person måste du bara skicka namnparametern.
<?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);
En DELETE-begäran är rakt framåt. Du behöver bara träffa slutpunkten enligt följande.
<?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
Jag hoppas att du fick veta om Guzzle och grunderna för hur du använder det. Du kan läsa mer om Guzzle Request Options i deras dokumentation. Dela dina tankar eller förslag i kommentarsektionen nedan.
relaterade artiklar
- YouTube API – Hur får jag en lista över YouTube-videor från din kanal
- TinyPNG Komprimera bilder med PHP
- HTML-formvalidering med persilja