Esecuzione di richieste HTTP DA Laravel a un'API esterna


157

Quello che voglio è ottenere un oggetto da un'API con una richiesta HTTP (ad esempio, AJAX di jQuery) a un'API esterna. Come inizio Ho fatto ricerche su Mr Google, ma non riesco a trovare nulla di utile.

Sto iniziando a chiedermi: è possibile? In questo post Laravel 4 invia una richiesta di post dal controller all'URL esterno con dati che sembrano fattibile. Ma non c'è alcun esempio né alcuna fonte dove trovare della documentazione.

Per favore aiutatemi?


9
Molto tempo dopo, ho creato un tut molto piccolo su come usare Guzzle. Da aisnoek la sua risposta. chilion.nl/laravel-post-requests-with- guzzle
Chilion

Se sei ancora interessato puoi anche usare Curl per questo, immagino che potresti dire che curl è il jquery ajax per PHP in qualche forma.
Killstreet,

Risposte:


195

Basato su una risposta a una domanda simile qui: https://stackoverflow.com/a/22695523/1412268

Dai un'occhiata 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", ....

2
Vedi anche la risposta di Jeremie Ges, Sembra fantastico, anche se in realtà non risponde alla mia domanda su un modo Laravel, ci penserò sicuramente. Grazie!
Chilion,

3
@Chilion, Al Snoek TI stava guidando verso un pacchetto Laravel ufficiale. È preinstallato nel gruppo di fornitori laravel.
parker_codes

sto ottenendo un oggetto Stream invece della stringa json. qualcuno può aiutarmi?
Renan Coelho,

Faccio la stessa cosa ma il mio browser gira all'infinito
Amirouche Zeggagh l'

V'è ora un modo più semplice in laravel 7.x: stackoverflow.com/a/60908329/2341298
Syclone

95

Possiamo usare il pacchetto Guzzle in Laravel, è un client HTTP PHP per inviare richieste HTTP.

Puoi installare Guzzle tramite il compositore

composer require guzzlehttp/guzzle:~6.0

Oppure puoi specificare Guzzle come dipendenza nell'attuale composer.json del tuo progetto

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

Codice di esempio in laravel 5 usando Guzzle come mostrato di seguito,

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
La ringrazio per la risposta. Vedi anche il mio commento sotto il mio post; Molto tempo dopo, ho creato un tut molto piccolo su come usare Guzzle. Da aisnoek la sua risposta. chilion.nl/laravel-post-requests-with- guzzle - Chilion 19 agosto alle 12:09 √
Chilion

1
Il tuo commento // "200"dovrebbe essere // 200perché il valore restituito è un numero intero.
meccanico

57

Vuoi solo chiamare un URL esterno e utilizzare i risultati? PHP lo fa immediatamente, se stiamo parlando di una semplice richiesta GET a qualcosa che serve JSON:

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

Se vuoi fare una richiesta post, è un po 'più difficile ma ci sono molti esempi su come farlo con il ricciolo.

Quindi immagino che la domanda sia; Cosa vuoi esattamente?


Voglio essere in grado di utilizzare tutti i tipi di funzioni di un'API REST. Quindi sì, avrò bisogno di POST. Ho pensato (sperato ...) che Laravel avrebbe avuto alcuni metodi per farlo in un certo modo Laravel, ma allora mi atterrò a PHP. Grazie.
Chilion,

Se non hai bisogno del risultato, stai solo cercando di colpire l'API o PING un URL, questo è l'approccio migliore. Grazie :)
Rafik Farhad,

8

A partire da Laravel v7.X , il framework ora include un'API minima racchiusa nel client HTTP Guzzle . Fornisce un modo semplice per effettuare richieste get , post , put , patch ed eliminazioni utilizzando il client 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');

È possibile gestire le risposte utilizzando il set di metodi fornito Illuminate\Http\Client\Responsedall'istanza restituita.

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

Ovviamente, dovrai installare Guzzle in questo modo:

composer require guzzlehttp/guzzle

Ci sono molte più utili funzioni integrate e puoi scoprire di più su questo set di funzionalità qui: https://laravel.com/docs/7.x/http-client

Questo è sicuramente il modo più semplice per effettuare chiamate API esterne all'interno di Laravel.


7

Aggiornato il 21 marzo 2019

Aggiungi GuzzleHttppacchetto usandocomposer require guzzlehttp/guzzle:~6.3.3

Oppure puoi specificare Guzzle come dipendenza nel progetto composer.json

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

Includi sotto la riga nella parte superiore della classe in cui stai chiamando l'API

use GuzzleHttp\Client;

Aggiungi sotto il codice per effettuare la richiesta

$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();
    }

5

Sicuramente, per qualsiasi progetto PHP, potresti voler utilizzare GuzzleHTTP per inviare richieste. Guzzle ha un'ottima documentazione che puoi controllare qui . Voglio solo dirlo, probabilmente vuoi centralizzare l'uso della classe Client di Guzzle in qualsiasi componente del tuo progetto Laravel (ad esempio un tratto) invece di creare istanze Client su diversi controller e componenti di Laravel (come molti articoli e le risposte suggeriscono).

Ho creato un tratto che puoi provare a utilizzare, che ti consente di inviare richieste da qualsiasi componente del tuo progetto Laravel, semplicemente utilizzandolo e chiamando 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;
    }
}

Si noti che questa caratteristica può persino gestire l'invio di file.

Se vuoi maggiori dettagli su questo tratto e alcune altre cose per integrare questo tratto su Laravel, consulta questo articolo . Inoltre, se sei interessato a questo argomento o hai bisogno di maggiore assistenza, puoi seguire il mio corso che ti guida durante l'intero processo.

Spero che aiuti tutti voi.

Auguri :)


1

Puoi usare Httpful:

Sito Web: http://phphttpclient.com/

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


Sembra fantastico, anche se in realtà non risponde alla mia domanda su un modo Laravel, sicuramente esaminerò questo. Grazie!
Chilion,

1
Laravel non lo ha fatto fin dall'inizio, ma Laravel funziona sotto il compositore, quindi puoi usare una libreria come Httpful per completare il lavoro. Tra l'altro è possibile utilizzare anche requests.ryanmccue.info
Jeremie Ges

Laravel è in fase di composizione, quindi ogni pacchetto è un gioco equo.
Kratos,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.