Em uma época onde a interoperabilidade entre sistemas tem se tornado cada vez mais importante e a criação/utilização de APIs é cada vez mais ascendente, é sempre importante pensarmos no consumo de serviços de terceiros dentro de nossos projetos.
No php, apesar de ser relativamente simples fazer requisições “http” com os recursos nativos da própria linguagem, o recomendado é que seja utilizado uma biblioteca para essa finalidade, uma vez que assim temos mais segurança e recursos que facilitam e que tornam mais ágil esse procedimento.
Uma das bibliotecas “http client” mais populares para a linguagem php é o Guzzle (https://docs.guzzlephp.org/en/stable/), que segundo a própria documentação oficial, “é um cliente PHP HTTP que torna fácil o envio de requisições HTTP e trivial para a integração com web services“.
Sendo assim, o intuito desse post é mostrar para vocês como fazer requisições HTTP no php utilizando o Guzzle.
Antes de mais nada, precisamos instalar o Guzzle em nosso projeto. Para fazer isso, vou utilizar o Composer:
composer require guzzlehttp/guzzle:^7.0 |
Uma vez acoplado, para fazer requisições básicas utilizando o Guzzle é simples. Basta instanciar a classe Guzzle\Client
1 2 3 4 5 6 | <?php require 'vendor/autoload.php'; use GuzzleHttp\Client; $client = new Client(); |
O objeto $client provê o método request onde passamos no primeiro parâmetro o tipo da requisição (Ex: GET, POST, PUT ou DELETE) e no segundo a URL do web service que será consumido.
Vamos supor, por exemplo, a chamada de um serviço na API REST do Github (https://docs.github.com/pt/rest). Vamos consumir os dados da URL: https://api.github.com/users/rafaelwendel
Através dessa chamada, será retornado um JSON com os dados do usuário rafaelwendel
1 2 3 4 5 6 7 8 | <?php require 'vendor/autoload.php'; use GuzzleHttp\Client; $client = new Client(); $response = $client->request('GET', 'https://api.github.com/users/rafaelwendel'); echo $response->getBody(); |
A variável $response vai receber todos os dados retornados a partir da requisição solicitada. A execução do código acima vai produzir o seguinte resultado:
{
"login": "rafaelwendel",
"id": 2855089,
"node_id": "MDQ6VXNlcjI4NTUwODk=",
"avatar_url": "https://avatars.githubusercontent.com/u/2855089?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/rafaelwendel",
"html_url": "https://github.com/rafaelwendel",
"followers_url": "https://api.github.com/users/rafaelwendel/followers",
"following_url": "https://api.github.com/users/rafaelwendel/following{/other_user}",
"gists_url": "https://api.github.com/users/rafaelwendel/gists{/gist_id}",
"starred_url": "https://api.github.com/users/rafaelwendel/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/rafaelwendel/subscriptions",
"organizations_url": "https://api.github.com/users/rafaelwendel/orgs",
"repos_url": "https://api.github.com/users/rafaelwendel/repos",
"events_url": "https://api.github.com/users/rafaelwendel/events{/privacy}",
"received_events_url": "https://api.github.com/users/rafaelwendel/received_events",
"type": "User",
"site_admin": false,
"name": "Rafael Pinheiro",
"company": null,
"blog": "https://www.rafaelwendel.com",
"location": "Capivari-SP, Brasil",
"email": null,
"hireable": null,
"bio": "Professor no Instituto Federal de Educação, Ciência e Tecnologia de São Paulo - Campus Capivari.",
"twitter_username": null,
"public_repos": 10,
"public_gists": 0,
"followers": 19,
"following": 15,
"created_at": "2012-11-21T15:57:59Z",
"updated_at": "2021-04-18T20:27:41Z"
} |
Para facilitar a manipulação/utilização dos dados retornados, podemos converter o JSON para um objeto do php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php require 'vendor/autoload.php'; use GuzzleHttp\Client; $client = new Client(); $response = $client->request('GET', 'https://api.github.com/users/rafaelwendel'); //converts to php object $github_user = json_decode($response->getBody()); //prints the "name" (Rafael Pinheiro) echo $github_user->name; //prints the "blog" (https://www.rafaelwendel.com) echo $github_user->blog; |
Espero que gostem do conteúdo e qualquer dúvida é só deixar um comentário.
Abs!