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!