Hacer solicitudes HTTP DE Laravel a una API externa

157

Lo que quiero es obtener un objeto de una API con una solicitud HTTP (por ejemplo, jQuery's AJAX) a una API externa. ¿Como empiezo? Investigué sobre el Sr. Google pero no encuentro nada que me ayude.

Estoy empezando a preguntarme si esto es posible. En esta publicación, Laravel 4 realiza una solicitud de publicación desde el controlador a la url externa con datos que parece que se puede hacer. Pero no hay ningún ejemplo ni ninguna fuente donde encontrar alguna documentación.

¿Por favor, ayúdame?

Chilion
fuente
9
Mucho tiempo después, creó un pequeño tutorial sobre cómo usar Guzzle. De aisnoek su respuesta. chilion.nl/laravel-post-requests-with-guzzle
Chilion
Si todavía está interesado, también puede usar Curl para esto, supongo que podría decir que curl es el jquery ajax para PHP de alguna forma.
killstreet

Respuestas:

195

Basado en una respuesta de una pregunta similar aquí: https://stackoverflow.com/a/22695523/1412268

Echa un vistazo a 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
fuente
2
También vea la respuesta de Jeremie Ges, Se ve genial, aunque no responde a mi pregunta de hecho sobre una especie de Laravel, seguramente lo investigaré. ¡Gracias!
Chilion
3
@Chilion, Al Snoek te estaba dirigiendo hacia un paquete oficial de Laravel. Está preinstalado en el grupo de proveedores de laravel.
parker_codes
estoy obteniendo un objeto Stream en lugar de una cadena json. ¿alguien me puede ayudar?
Renan Coelho
Estoy haciendo lo mismo pero mi navegador se vuelve infinito
Amirouche Zeggagh
Ahora hay una manera más fácil en Laravel 7.x: stackoverflow.com/a/60908329/2341298
Syclone
95

Podemos usar el paquete Guzzle en Laravel, es un cliente HTTP PHP para enviar solicitudes HTTP.

Puedes instalar Guzzle a través del compositor

composer require guzzlehttp/guzzle:~6.0

O puede especificar Guzzle como una dependencia en el composer.json existente de su proyecto

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

Código de ejemplo en laravel 5 usando Guzzle como se muestra a continuación,

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
fuente
2
Gracias por su respuesta. También vea mi comentario debajo de mi publicación; Mucho tiempo después, creó un pequeño tutorial sobre cómo usar Guzzle. De aisnoek su respuesta. chilion.nl/laravel-post-requests-with-guzzle - Chilion 19 de agosto a las 12:09 √
Chilion
1
Su comentario // "200"debe ser // 200porque el valor devuelto es un entero.
Mecánico
57

¿Solo desea llamar a una URL externa y usar los resultados? PHP hace esto de forma inmediata, si estamos hablando de una simple solicitud GET a algo que sirve a JSON:

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

Si desea hacer una solicitud posterior, es un poco más difícil, pero hay muchos ejemplos de cómo hacerlo con curl.

Entonces supongo que la pregunta es; exactamente, que es lo que quieres?

Bram
fuente
Quiero poder usar todo tipo de funciones de una API REST. Entonces sí, necesitaré POST. Pensé (esperaba ...) que Laravel tendría algunos métodos para hacerlo de alguna manera, pero me quedaré con PHP. Gracias.
Chilion
Si no necesita el resultado, solo intenta HIT la API o PING una URL, este es el mejor enfoque. Gracias :)
Rafik Farhad
8

A partir de Laravel v7.X , el marco ahora viene con una API mínima envuelta alrededor del cliente Guzzle HTTP . Proporciona una manera fácil de realizar solicitudes de obtención , publicación , colocación , parche y eliminación utilizando el 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');

Puede administrar las respuestas utilizando el conjunto de métodos proporcionados por la Illuminate\Http\Client\Responseinstancia devuelta.

$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;

Tenga en cuenta que, por supuesto, necesitará instalar Guzzle así:

composer require guzzlehttp/guzzle

Hay muchas más funciones útiles integradas y puede encontrar más información sobre este conjunto de funciones aquí: https://laravel.com/docs/7.x/http-client

Esta es definitivamente la forma más fácil de hacer llamadas API externas dentro de Laravel.

Syclone
fuente
7

Actualizado el 21 de marzo de 2019

Agregar GuzzleHttppaquete usandocomposer require guzzlehttp/guzzle:~6.3.3

O puede especificar Guzzle como una dependencia en el proyecto composer.json

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

Incluya la siguiente línea en la parte superior de la clase donde está llamando a la API

use GuzzleHttp\Client;

Agregue el siguiente código para hacer la solicitud

$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
fuente
5

Definitivamente, para cualquier proyecto PHP, es posible que desee utilizar GuzzleHTTP para enviar solicitudes. Guzzle tiene muy buena documentación que puedes consultar aquí . Solo quiero decir que, probablemente desee centralizar el uso de la clase de cliente de Guzzle en cualquier componente de su proyecto Laravel (por ejemplo, un rasgo) en lugar de crear instancias de cliente en varios controladores y componentes de Laravel (como muchos artículos y las respuestas sugieren).

Creé un rasgo que puede intentar usar, que le permite enviar solicitudes desde cualquier componente de su proyecto Laravel, simplemente usándolo y llamando 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;
    }
}

Tenga en cuenta que este rasgo incluso puede manejar el envío de archivos.

Si desea más detalles sobre este rasgo y algunas otras cosas para integrar este rasgo a Laravel, consulte este artículo . Además, si está interesado en este tema o necesita ayuda importante, puede tomar mi curso que lo guiará en todo el proceso.

Espero que les sirva de ayuda.

Los mejores deseos :)

JuanDMeGon
fuente
1

Puedes usar Httpful:

Sitio web: http://phphttpclient.com/

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

Jeremie Ges
fuente
Se ve muy bien, aunque no responde a mi pregunta, de hecho, sobre una especie de Laravel, seguramente lo investigaré. ¡Gracias!
Chilion
1
Laravel no lo ha sacado de la caja, pero Laravel se ejecuta bajo el compositor para que pueda usar una biblioteca como Httpful para hacer el trabajo. Por cierto, también puede usar request.ryanmccue.info
Jeremie Ges
Laravel está bajo compositor, por lo que cualquier paquete es un juego justo.
kratos