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?

Chilion
fonte
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", ....
AI Snoek
fonte
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"...'
}
Mohammed Safeer
fonte
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?

Bram
fonte
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();
    }
mujuonly
fonte
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.

Syclone
fonte
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 :)

JuanDMeGon
fonte
1

Você pode usar o Httpful:

Website: http://phphttpclient.com/

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

Jeremie Ges
fonte
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