Fazendo solicitações HTTP do Laravel para uma API externa


157

O que eu quero é obter um objeto de uma API com uma solicitação HTTP (por exemplo, AJAX do jQuery) para uma API externa. Como eu começo? Eu pesquisei no Google, mas não consigo encontrar nada que ajude.

Estou começando a me perguntar se isso é possível? Neste post, o Laravel 4 faz uma solicitação de postagem do controlador para a URL externa com dados que parece que isso pode ser feito. Mas não há exemplo nem fonte de onde encontrar alguma documentação.

Por favor, me ajude?


9
Muito tempo depois, criou um pequeno tutorial de como usar o Guzzle. De aisnoek, sua resposta. chilion.nl/laravel-post-requests-with-guzzle
Quiliom

Se ainda estiver interessado, você também pode usar o Curl para isso, acho que você poderia dizer que o curl é o jquery ajax para PHP de alguma forma.
Killstreet

Respostas:


195

Com base na resposta de uma pergunta semelhante aqui: https://stackoverflow.com/a/22695523/1412268

Dê uma olhada no Guzzle

$client = new GuzzleHttp\Client();
$res = $client->get('https://api.github.com/user', ['auth' =>  ['user', 'pass']]);
echo $res->getStatusCode(); // 200
echo $res->getBody(); // { "type": "User", ....

2
Veja também a resposta de Jeremie Ges, Parece ótimo, embora não responda de fato à minha pergunta sobre o Laravel, certamente analisarei isso. Obrigado!
Chilion

3
@Chilion, Al Snoek estava direcionando você para um pacote oficial do Laravel. Está pré-instalado no grupo de fornecedores laravel.
Parker_codes 18/11

estou recebendo um objeto Stream em vez de string json. alguém pode me ajudar?
Renan Coelho

Eu fazendo a mesma coisa, mas a minha vez navegador infinitamente
Amirouche Zeggagh

Agora existe uma maneira mais fácil no Laravel 7.x: stackoverflow.com/a/60908329/2341298
Syclone

95

Podemos usar o pacote Guzzle no Laravel, é um cliente HTTP PHP para enviar solicitações HTTP.

Você pode instalar o Guzzle através do compositor

composer require guzzlehttp/guzzle:~6.0

Ou você pode especificar o Guzzle como uma dependência no compositor existente do seu projeto.

{
   "require": {
      "guzzlehttp/guzzle": "~6.0"
   }
}

Exemplo de código no laravel 5 usando o Guzzle, como mostrado abaixo,

use GuzzleHttp\Client;
class yourController extends Controller {

    public function saveApiData()
    {
        $client = new Client();
        $res = $client->request('POST', 'https://url_to_the_api', [
            'form_params' => [
                'client_id' => 'test_id',
                'secret' => 'test_secret',
            ]
        ]);
        echo $res->getStatusCode();
        // 200
        echo $res->getHeader('content-type');
        // 'application/json; charset=utf8'
        echo $res->getBody();
        // {"type":"User"...'
}

2
Obrigado pela sua resposta. Veja também o meu comentário abaixo do meu post; Muito tempo depois, criou um pequeno tutorial de como usar o Guzzle. De aisnoek, sua resposta. chilion.nl/laravel-post-requests-with-guzzle - Chilion 19 de agosto às 12:09 √
Chilion

1
Seu comentário // "200"deve ser // 200porque o valor retornado é um número inteiro.
mechanicious

57

Você só quer chamar um URL externo e usar os resultados? O PHP faz isso imediatamente, se estamos falando de uma solicitação GET simples para algo que serve JSON:

$json = json_decode(file_get_contents('http://host.com/api/stuff/1'), true);

Se você deseja fazer uma solicitação de postagem, é um pouco mais difícil, mas há muitos exemplos de como fazer isso com curl.

Então eu acho que a pergunta é; o que exatamente você quer?


Eu quero poder usar todos os tipos de funções de uma API REST. Então, sim, vou precisar do POST. Eu pensei (esperava ...) que o Laravel tivesse alguns métodos para fazê-lo de uma maneira meio Laravel, mas vou seguir o PHP então. Obrigado.
Chilion

Se você não precisar do resultado, apenas tentando HIT na API ou PING um URL, esta é a melhor abordagem. Obrigado :)
Rafik Farhad

7

Actualizado 21 de março de 2019

Adicionar GuzzleHttppacote usandocomposer require guzzlehttp/guzzle:~6.3.3

Ou você pode especificar o Guzzle como uma dependência nas configurações do seu projeto. composer.json

{
   "require": {
      "guzzlehttp/guzzle": "~6.3.3"
   }
}

Inclua a linha abaixo na parte superior da classe em que você está chamando a API

use GuzzleHttp\Client;

Adicione o código abaixo para fazer a solicitação

$client = new Client();

    $res = $client->request('POST', 'http://www.exmple.com/mydetails', [
        'form_params' => [
            'name' => 'george',
        ]
    ]);

    if ($res->getStatusCode() == 200) { // 200 OK
        $response_data = $res->getBody()->getContents();
    }

7

A partir do Laravel v7.X , a estrutura agora vem com uma API mínima envolvida no cliente HTTP Guzzle . Ele fornece uma maneira fácil de fazer solicitações de obtenção , postagem , colocação , correção e exclusão usando o Cliente HTTP :

use Illuminate\Support\Facades\Http;

$response = Http::get('http://test.com');
$response = Http::post('http://test.com');
$response = Http::put('http://test.com');
$response = Http::patch('http://test.com');
$response = Http::delete('http://test.com');

Você pode gerenciar respostas usando o conjunto de métodos fornecidos pela Illuminate\Http\Client\Responseinstância retornada.

$response->body() : string;
$response->json() : array;
$response->status() : int;
$response->ok() : bool;
$response->successful() : bool;
$response->serverError() : bool;
$response->clientError() : bool;
$response->header($header) : string;
$response->headers() : array;

Observe que você precisará, é claro, instalar o Guzzle da seguinte forma:

composer require guzzlehttp/guzzle

Existem recursos muito mais úteis integrados e você pode descobrir mais sobre esses conjuntos de recursos aqui: https://laravel.com/docs/7.x/http-client

Definitivamente, agora é a maneira mais fácil de fazer chamadas externas à API no Laravel.


5

Definitivamente, para qualquer projeto PHP, você pode usar o GuzzleHTTP para enviar solicitações. Guzzle tem uma documentação muito boa, você pode conferir aqui . Eu só quero dizer que você provavelmente deseja centralizar o uso da classe Client do Guzzle em qualquer componente do seu projeto Laravel (por exemplo, uma característica) em vez de criar instâncias do cliente em vários controladores e componentes do Laravel (como muitos artigos e as respostas sugerem).

Eu criei uma característica que você pode tentar usar, que permite enviar solicitações de qualquer componente do seu projeto Laravel, apenas usando-o e ligando para makeRequest.

namespace App\Traits;
use GuzzleHttp\Client;
trait ConsumesExternalServices
{
    /**
     * Send a request to any service
     * @return string
     */
    public function makeRequest($method, $requestUrl, $queryParams = [], $formParams = [], $headers = [], $hasFile = false)
    {
        $client = new Client([
            'base_uri' => $this->baseUri,
        ]);

        $bodyType = 'form_params';

        if ($hasFile) {
            $bodyType = 'multipart';
            $multipart = [];

            foreach ($formParams as $name => $contents) {
                $multipart[] = [
                    'name' => $name,
                    'contents' => $contents
                ];
            }
        }

        $response = $client->request($method, $requestUrl, [
            'query' => $queryParams,
            $bodyType => $hasFile ? $multipart : $formParams,
            'headers' => $headers,
        ]);

        $response = $response->getBody()->getContents();

        return $response;
    }
}

Observe que essa característica pode até lidar com o envio de arquivos.

Se você quiser obter mais detalhes sobre essa característica e outras coisas para integrar essa característica ao Laravel, consulte este artigo . Além disso, se você estiver interessado neste tópico ou precisar de ajuda importante, pode seguir meu curso, que o orienta em todo o processo.

Espero que ajude todos vocês.

Muitas felicidades :)


1

Você pode usar o Httpful:

Website: http://phphttpclient.com/

Github: https://github.com/nategood/httpful


Parece ótimo, embora não responda de fato à minha pergunta sobre o Laravel, certamente analisarei isso. Obrigado!
Chilion 4/04

1
O Laravel não tirou isso da caixa, mas o Laravel é executado sob o compositor para que você possa usar uma biblioteca como o Httpful para fazer o trabalho. Pela maneira que você pode usar também requests.ryanmccue.info
Jeremie Ges

O Laravel está sob o compositor, então qualquer pacote é um jogo justo.
kratos
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.