Como usar o Guzzle – um cliente PHP HTTP para enviar solicitações HTTP
O desenvolvedor sempre se depara com uma tarefa em que precisa enviar solicitações HTTP para outros recursos e lidar com a resposta. A maneira mais comum de realizar essas tarefas é usando um cURL. No entanto, usar o cURL não é relativamente fácil para um iniciante. Além disso, para escrever um script em cURL, seu servidor deve ter habilitado a extensão cURL.
Guzzle é uma alternativa ao cURL. É um cliente PHP HTTP que facilita o envio de solicitações HTTP e facilita a integração com serviços da web. Mesmo, posso dizer por experiência própria, Guzzle é melhor do que cURL. É simples e fácil de usar. Se você estiver usando o Guzzle, não precisa ter a extensão cURL em seu servidor. Oferece uma melhor formatação de código em comparação com cURL.
Dito isso, vamos ver como usar o Guzzle em seu aplicativo.
Instalação
A maneira recomendada de instalar o Guzzle é por meio do Composer. Se você não instalou o Composer em seu sistema, pode obtê-lo aqui.
Abra o terminal no diretório raiz do seu projeto e execute o comando abaixo para instalar o Guzzle.
composer require guzzlehttp/guzzle
O Guzzle fornece suporte para todas as solicitações HTTP que são GET, DELETE, HEAD, OPTIONS, PATCH, POST e PUT. Neste tutorial, estudamos como usar o Guzzle para enviar solicitações HTTP e lidar com as respostas com ele.
Como exemplo, tomo o serviço REQ | RES, que fornece uma API real falsa para testar solicitações HTTP.
Como enviar uma solicitação HTTP usando o Guzzle
Após a instalação da biblioteca Guzzle, você precisa incluir um ambiente Guzzle em seu arquivo da seguinte maneira.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
Agora vamos tentar algumas operações, uma a uma, como GET, POST, upload de arquivo, copiar arquivo de URL remota para um diretório local, PUT, PATCH e DELETE.
Solicitação GET usando Guzzle
Se você olhar o site REQ | RES, eles forneceram alguns endpoints para solicitações ‘GET’. Vou pegar o exemplo de ponto de extremidade ‘LISTAR USUÁRIOS’. Para obter a lista de usuários, eles pedem para enviar uma solicitação GET para este endpoint https://reqres.in/api/users?page=2.
No Guzzle, enviaremos este pedido GET da seguinte forma.
<?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);
Primeiro extraí um ‘base_uri’ (URL comum) como https://reqres.in. Aqui, o endpoint final é ‘/ api / users’ e requer um parâmetro GET como ‘page’. No Guzzle, você pode enviar parâmetros GET usando o array ‘query’ conforme mostrado no código acima.
Solicitação POST usando Guzzle
Normalmente, existem 2 tipos de solicitações POST. Pode ser necessário POSTar parâmetros como solicitação POST ‘application / x-www-form-urlencoded’ ou fazer upload de dados codificados em JSON como um corpo da solicitação. Você pode postar dados codificados em JSON conforme mostrado abaixo.
<?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);
No caso da solicitação POST ‘application / x-www-form-urlencoded’, você pode POSTar os parâmetros da seguinte maneira.
<?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!']
]
]);
Em alguns casos, os endpoints da API pedem que você envie um token de autorização em cada solicitação HTTP. O usuário pode enviar este token como cabeçalhos em sua solicitação Guzzle.
<?php
$client->request('POST', '/endpoint_here', [
"headers" => [
"Authorization" => "Bearer TOKEN_VALUE"
],
'form_params' => [
'foo' => 'bar',
'baz' => ['hi', 'there!']
]
]);
Copiar arquivo do servidor remoto usando Guzzle
Se você deseja copiar um arquivo de um servidor remoto para o diretório local, o Guzzle será uma opção melhor. Digamos que você queira copiar esta imagem em https://artisansweb.net/wp-content/uploads/2020/03/blog.jpg como ‘blog.jpg’ para seu diretório local. Vamos escrever o código para ele conforme mostrado abaixo.
<?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);
Upload de arquivo usando Guzzle
Como todos sabemos, para enviar arquivos, precisamos definir o corpo da solicitação como um formulário ‘multipart / form-data’. O código básico no Guzzle para upload de arquivos seria escrito como abaixo.
<?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'
],
]
]);
Para demonstrar o upload do arquivo, pegarei um exemplo ao vivo da API reSmush.it que envia uma versão otimizada da imagem em resposta. Você precisa POSTAR sua imagem em seu endpoint. O código para ele usando Guzzle da seguinte maneira.
<?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 e DELETE Request using Guzzle
As solicitações PUT e PATCH são usadas para atualizar os recursos. No entanto, essas 2 solicitações fazem isso de maneira diferente.
PUT sobrescreve toda a entidade, se ela já existir, e cria um novo recurso, se ainda não existir. Se você deseja atualizar o nome de uma pessoa, você precisa enviar todo o recurso ao fazer uma solicitação PUT.
<?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);
A solicitação PATCH aplica uma atualização parcial ao recurso. Isso significa que você só precisa enviar os dados que deseja atualizar e não afetará ou alterará mais nada. Portanto, se você deseja atualizar o nome de uma pessoa, será necessário apenas enviar o parâmetro 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);
Uma solicitação DELETE é direta. Você só precisa atingir o ponto de extremidade da seguinte maneira.
<?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
Espero que você conheça o Guzzle e os princípios básicos de como usá-lo. Você pode ler mais sobre Guzzle Request Options em sua documentação. Por favor, compartilhe suas idéias ou sugestões na seção de comentários abaixo.
Artigos relacionados
- API do YouTube – Como obter uma lista de vídeos do YouTube do seu canal
- TinyPNG compactar imagens usando PHP
- Validação de formulário HTML usando o Parsley