So verwenden Sie Guzzle – Ein PHP-HTTP-Client zum Senden von HTTP-Anfragen
Der Entwickler stößt immer auf eine Aufgabe, bei der er HTTP-Anfragen an andere Ressourcen senden und die Antwort verarbeiten muss. Die gängige Methode zum Ausführen dieser Aufgaben ist die Verwendung einer cURL. Die Verwendung der cURL ist für einen Anfänger jedoch nicht relativ einfach. Um auch ein Skript in cURL zu schreiben, sollte Ihr Server die cURL-Erweiterung aktiviert haben.
Guzzle ist eine Alternative zu cURL. Es ist ein PHP-HTTP-Client, der das Senden von HTTP-Anfragen vereinfacht und die Integration in Webdienste vereinfacht. Auch kann ich aus meiner Erfahrung sagen, dass Guzzle besser ist als cURL. Es ist einfach und leicht zu bedienen. Wenn Sie Guzzle verwenden, benötigen Sie keine cURL-Erweiterung auf Ihrem Server. Es bietet Ihnen eine bessere Formatierung des Codes im Vergleich zu cURL.
Sehen wir uns jedoch an, wie Sie Guzzle in Ihrer Anwendung verwenden.
Installation
Die empfohlene Methode zur Installation von Guzzle ist über den Composer. Wenn Sie Composer nicht auf Ihrem System installiert haben, können Sie ihn hier herunterladen.
Öffnen Sie das Terminal im Stammverzeichnis Ihres Projekts und führen Sie den folgenden Befehl aus, um Guzzle zu installieren.
composer require guzzlehttp/guzzle
Guzzle bietet Unterstützung für alle HTTP-Anfragen, die GET, DELETE, HEAD, OPTIONS, PATCH, POST und PUT sind. In diesem Tutorial lernen wir, wie Sie Guzzle zum Senden von HTTP-Anfragen verwenden und damit Antworten verarbeiten.
Als Beispiel nehme ich den REQ|RES- Dienst, der eine gefälschte echte API zum Testen von HTTP-Anfragen bereitstellt.
So senden Sie eine HTTP-Anfrage mit Guzzle
Bei der Installation der Guzzle-Bibliothek müssen Sie wie folgt eine Guzzle-Umgebung in Ihre Datei aufnehmen.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
Versuchen wir nun nacheinander einige Operationen wie GET, POST, Dateiupload, Datei von Remote-URL in ein lokales Verzeichnis kopieren, PUT, PATCH und DELETE.
GET-Anfrage mit Guzzle
Wenn Sie sich die REQ|RES-Website ansehen, wurden einige Endpunkte für ‘GET’-Anfragen bereitgestellt. Ich nehme das Beispiel des Endpunkts ‘LIST USERS’. Um die Benutzerliste abzurufen, bitten sie darum, eine GET-Anforderung an diesen Endpunkt https://reqres.in/api/users?page=2 zu senden .
In Guzzle senden wir diese GET-Anfrage wie folgt.
<?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);
Zuerst habe ich eine ‘base_uri’ (gemeinsame URL) als https://reqres.in extrahiert. Hier ist der letzte Endpunkt ‘/api/users’ und erfordert einen GET-Parameter als ‘page’. In Guzzle können Sie GET-Parameter mit dem ‘query’-Array senden, wie im obigen Code gezeigt.
POST-Anfrage mit Guzzle
Normalerweise gibt es 2 Arten von POST-Anfragen. Möglicherweise müssen Sie Parameter als POST-Anfrage „application/x-www-form-urlencoded” POST oder JSON-codierte Daten als Hauptteil der Anfrage hochladen. Sie können JSON-codierte Daten wie unten gezeigt posten.
<?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);
Im Fall der POST-Anfrage ‘application/x-www-form-urlencoded’ können Sie die Parameter wie folgt POST-Parameter eingeben.
<?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!']
]
]);
In einigen Fällen werden Sie von API-Endpunkten aufgefordert, in jeder HTTP-Anforderung ein Autorisierungstoken zu senden. Der Benutzer kann dieses Token als Header in Ihrer Guzzle-Anfrage senden.
<?php
$client->request('POST', '/endpoint_here', [
"headers" => [
"Authorization" => "Bearer TOKEN_VALUE"
],
'form_params' => [
'foo' => 'bar',
'baz' => ['hi', 'there!']
]
]);
Kopieren Sie eine Datei vom Remote-Server mit Guzzle
Wenn Sie eine Datei von einem Remote-Server in Ihr lokales Verzeichnis kopieren möchten, ist Guzzle eine bessere Option. Angenommen, Sie möchten dieses Bild unter https://artisansweb.net/wp-content/uploads/2020/03/blog.jpg als ‘blog.jpg’ in Ihr lokales Verzeichnis kopieren. Wir werden den Code dafür wie unten gezeigt schreiben.
<?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);
Datei-Upload mit Guzzle
Wie wir alle wissen, müssen wir zum Hochladen von Dateien den Hauptteil der Anfrage auf ein ‘multipart/form-data’-Formular setzen. Der grundlegende Code in Guzzle zum Hochladen von Dateien würde wie folgt aussehen.
<?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'
],
]
]);
Um das Hochladen der Datei zu demonstrieren, nehme ich ein Live-Beispiel der reSmush.it-API, die als Antwort eine optimierte Version des Bildes sendet. Sie müssen Ihr Image an ihren Endpunkt POST. Der Code dafür mit Guzzle wie folgt.
<?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- und DELETE-Anfrage mit Guzzle
Die PUT- und PATCH-Anforderungen werden verwendet, um die Ressourcen zu aktualisieren. Diese 2 Anfragen machen es jedoch anders.
PUT überschreibt die gesamte Entität, wenn sie bereits vorhanden ist, und erstellt eine neue Ressource, wenn sie nicht vorhanden ist. Wenn Sie den Namen einer Person aktualisieren möchten, müssen Sie bei einer PUT-Anfrage die gesamte Ressource senden.
<?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);
Die PATCH-Anforderung wendet eine Teilaktualisierung auf die Ressource an. Das bedeutet, dass Sie nur die Daten senden müssen, die Sie aktualisieren möchten, und dies beeinflusst oder ändert nichts anderes. Wenn Sie also den Namen einer Person aktualisieren möchten, müssen Sie nur den Namensparameter senden.
<?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);
Eine DELETE-Anfrage ist unkompliziert. Sie müssen nur den Endpunkt wie folgt erreichen.
<?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
Ich hoffe, Sie haben Guzzle und die Grundlagen seiner Verwendung kennengelernt. Weitere Informationen zu Guzzle-Request-Optionen finden Sie in der Dokumentation. Bitte teilen Sie Ihre Gedanken oder Vorschläge im Kommentarbereich unten mit.
Zum Thema passende Artikel
- YouTube API – So erhalten Sie eine Liste der YouTube-Videos Ihres Kanals
- TinyPNG Bilder mit PHP komprimieren
- HTML-Formularvalidierung mit Petersilie