Come utilizzare il client integrato di Laravel per interagire con le API esterne

Pubblicato: 2023-04-24

Laravel rende le interazioni API un gioco da ragazzi sia per gli sviluppatori web nuovi che per quelli esperti. Il client HTTP Larvel è basato sul client HTTP Guzzle di PHP per offrire agli sviluppatori un'esperienza più fluida quando effettuano richieste HTTP. Le sue caratteristiche principali includono l'autenticazione, il routing e l'efficace mappatura relazionale degli oggetti (ORM).

Questo articolo esplorerà l'utilizzo del client HTTP di Laravel per effettuare richieste, eseguire il debug delle risposte, creare middleware e macro e altro ancora.

Il client HTTP di Laravel fa il duro lavoro per te per le API

Guzzle è un semplice client HTTP per PHP. Offre funzionalità per diverse richieste di moduli, tra cui GET , POST , PUT e DELETE insieme alle funzionalità di streaming e alle richieste multipart. Con il client Guzzle HTTP è possibile inviare richieste sincrone e asincrone al server. Inoltre, viene fornito con un middleware decente per personalizzare il comportamento del client.

Il client HTTP di Laravel è un wrapper basato su Guzzle ma con funzionalità extra. Include il supporto per riprovare le richieste non riuscite e alcune funzioni di supporto con i dati JSON. La maggior parte delle funzionalità dei client HTTP Laravel sono simili a Guzzle.

Ottieni il massimo dal client integrato di Laravel per le interazioni API! Nuovo alle API? Questa guida ti ha coperto Clicca per twittare

Prerequisiti

Nelle sezioni seguenti, imparerai di più sul client HTTP di Laravel. Per seguire, avrai bisogno di:

  • Conoscenza di base di Laravel, PHP e API
  • PHP e Composer installati
  • Postino

Come fare richieste

Per capire come utilizzare un client HTTP per effettuare una richiesta, puoi sfruttare numerose API ospitate, come ReqRes.

Inizia importando il pacchetto HTTP incluso durante la creazione dell'applicazione. All'interno del file App/Http/Controllers/UserController.php , aggiungi il seguente codice, iniziando con l'istruzione use all'inizio del file e il codice rimanente all'interno della funzione index.

 use Illuminate\Support\Facades\Http; return Http::get("https://reqres.in/api/users?page=2");

Nota: per casi d'uso complessi, puoi anche inviare la richiesta con intestazioni utilizzando il metodo withHeaders .

Nello stesso file, crea un nuovo metodo post utilizzando il codice seguente:

 function post() { $response = Http::withHeaders([ 'Content-Type' => 'application/json', ])->post('https://reqres.in/api/users', [ 'name' => 'morpheus', 'job' => 'leader', ]); return $response; }

Quindi aggiungi un percorso per esso all'interno del file route/web.php :

 Route::get('post',[UserController::class,'post']);

Ora, Postman può essere utilizzato per testare questo percorso. Apri Postman e aggiungi http://127.0.0.1:8000/post come URL, con il tipo di richiesta GET . Dopo aver fatto clic su invia , vedrai la seguente risposta:

Effettuare richieste utilizzando Postman
Effettuare richieste utilizzando Postman

Richieste concorrenti

Le richieste parallele migliorano significativamente le prestazioni poiché puoi recuperare più dati nello stesso periodo. Il client HTTP di Laravel consente di eseguire richieste simultanee utilizzando il metodo del pool.

All'interno di App/Http/Controllers/UserController.php , aggiungi il seguente codice:

 use Illuminate\Http\Client\Pool; function concurrent() { $responses = Http::pool(fn (Pool $pool) => [ $pool->get('https://reqres.in/api/users?page=2'), $pool->get('https://reqres.in/api/users/2'), $pool->get('https://reqres.in/api/users?page=2'), ]); return $responses[0]->ok() && $responses[1]->ok() && $responses[2]->ok(); }

Quindi, aggiungi il percorso di supporto all'interno del file route/web.php .

 Route::get('concurrent',[UserController::class,'concurrent']);

Il browser fornisce la seguente risposta quando il percorso viene visitato:

Richieste concorrenti
Richieste concorrenti

Richiedi macro

Le macro di richiesta sono utili quando si interagisce con percorsi API comuni.

Per creare la macro, è necessario definire la macro all'interno del metodo di avvio del file app/Http/Providers/AppServiceProvider.php utilizzando il codice seguente:

 use Illuminate\Support\Facades\Http; Http::macro('reqres', function () { return Http::baseUrl('https://reqres.in/api'); });

Nota: assicurarsi di aggiungere l'istruzione use all'inizio del file.

Quindi, utilizza la macro all'interno di UserController aggiungendo il seguente codice:

 function macro() { $response = Http::reqres()->get('/users?page=2'); return $response; }

Come puoi vedere, poiché la macro è già in fase di creazione, non è necessario aggiungere nuovamente l'URL completo.

Infine, aggiungi un percorso nel file route/web.php utilizzando il codice seguente:

 Route::get('macro',[UserController::class,'macro']);
Richiesta macro
Richiesta macro

Come decodificare le risposte

Per decodificare una risposta e garantire che una richiesta API abbia esito positivo, si utilizza il metodo status incluso nel client. Questo metodo ottiene il codice di stato inviato dal server e lo visualizza.

Per verificarlo, sostituisci il codice macro precedente con il codice seguente all'interno del file App/Http/Controllers/UserController.php :

 function macro() { $response = Http::reqres()->get('/users?page=2'); return $response->status(); }

Qui, il codice di stato 200 indica che la richiesta ha avuto successo.

Risposta di decodifica riuscita
Risposta di decodifica riuscita

Come testare le API JSON

Laravel ha diversi helper per testare le API JSON e le loro risposte. Le funzioni di supporto includono json , getJson , postJson , putJson , patchJson , deleteJson e così via.

Per comprendere meglio il Testing, crea uno scenario di test per la route dell'utente GET . Quando esegui il bootstrap dell'applicazione Laravel, il test di esempio è già stato creato. All'interno del file tests/Feature/ExampleTest.php , sostituisci il codice esistente con il seguente:

 <?php namespace Tests\Feature; use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class ExampleTest extends TestCase { /** * A basic test example. * * @return void */ public function test_example() { $response = $this->getJson('/users'); $response->assertStatus(200); } }

Il codice aggiunto recupera i dati JSON sul percorso dell'utente e controlla se il codice di stato è 200 o meno.

Dopo aver aggiunto il codice di test, esegui il seguente comando nel tuo terminale per eseguire i test:

 ./vendor/bin/phpunit

Una volta completati i test, vedrai che ha eseguito due test, entrambi con esito positivo.

Testare le API JSON
Testare le API JSON

Allo stesso modo, puoi verificare diversi tipi di richieste e utilizzare altri metodi di supporto per test più sofisticati.

Come gestire gli eventi

Laravel offre tre eventi da attivare quando si tratta di richieste HTTP.

  • RequestSending , che è prima che la richiesta venga inviata.
  • ResponseReceived , ovvero quando viene ricevuta una risposta.
  • ConnectionFailed , ovvero quando non viene ricevuta alcuna risposta.

Tutti e tre gli eventi includono la proprietà $request per ispezionare l'istanza Illuminate\Http\Client\Request e ResponseReceived ha una $response property aggiuntiva. Questi sono particolarmente utili per eseguire azioni dopo un evento. Ad esempio, potresti voler inviare un'e-mail dopo aver ricevuto una risposta positiva.

Per creare un evento e un listener, vai al file app/Providers/EventServiceProvider.php e sostituisci l'array di ascolto con il codice seguente.

 protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, ], 'Illuminate\Http\Client\Events\ResponseReceived' => [ 'App\Listeners\LogResponseReceived', ], ];

Quindi esegui il seguente comando nel tuo terminale:

 php artisan event:generate

Il comando precedente creerà il listener app/Listeners/LogResponseReceived.php . Sostituisci il codice di quel file con il codice seguente:

 <?php namespace App\Listeners; use Illuminate\Http\Client\Events\ResponseReceived; use Illuminate\Http\Request; use Illuminate\Http\Response; use Illuminate\Support\Facades\Log; class LogResponseReceived { /** * Create the event listener. * * @return void */ public function __construct(Request $request, Response $response) { Log::channel('stderr')->info($response->status()); } /** * Handle the event. * * @param \Illuminate\Http\Client\Events\ResponseReceived $event * @return void */ public function handle(ResponseReceived $event) { } }

Il registro delle informazioni del codice di stato viene stampato nel terminale.

Registri del terminale che mostrano il codice di stato
Registri del terminale che mostrano il codice di stato

Combina la potenza di Laravel e Guzzle per un'esperienza API senza soluzione di continuità. Pronto a migliorare le tue abilità di sviluppatore web? Inizia qui Fai clic per twittare

Riepilogo

Indipendentemente dal fatto che un sito Web o un'applicazione Web sia realizzato da un'organizzazione o da uno sviluppatore indipendente, le API sono la chiave del loro successo. Tuttavia, utilizzarli può essere difficile.

Molti framework e librerie promettono di semplificare questo processo, ma Laravel si distingue per la sua attenzione alla semplicità e alla facilità d'uso. Il loro client integrato supporta semplici chiamate API, chiamate API simultanee, macro API, metodi di supporto per API basate su JSON e altro ancora.