Cum să utilizați clientul încorporat Laravel pentru a interacționa cu API-urile externe

Publicat: 2023-04-24

Laravel face ca interacțiunile API să fie o briză atât pentru dezvoltatorii web noi, cât și pentru cei experimentați. Clientul HTTP Larvel este construit pe partea superioară a clientului HTTP Guzzle al PHP pentru a oferi dezvoltatorilor o experiență mai fluidă atunci când fac solicitări HTTP. Caracteristicile sale principale includ autentificarea, rutarea și maparea eficientă a relației obiectelor (ORM).

Acest articol va explora utilizarea clientului HTTP Laravel pentru a face solicitări, a depana răspunsuri, a crea middleware și macrocomenzi și multe altele.

Clientul HTTP Laravel face munca grea pentru dvs. pentru API-uri

Guzzle este un simplu client HTTP pentru PHP. Oferă funcționalități pentru diferite solicitări de formulare, inclusiv GET , POST , PUT și DELETE , alături de capabilitățile de streaming și solicitările cu mai multe părți. Cu clientul HTTP Guzzle, este posibilă trimiterea cererilor sincrone și asincrone către server. În plus, vine și cu middleware decent pentru a personaliza comportamentul clientului.

Clientul HTTP al lui Laravel este un wrapper construit pe Guzzle, dar cu funcționalități suplimentare. Include suport pentru reîncercarea cererilor eșuate și unele funcții de ajutor cu date JSON. Cele mai multe dintre funcționalitățile clienților HTTP Laravel sunt similare cu Guzzle.

Profitați la maximum de clientul încorporat al Laravel pentru interacțiunile API! Nou în API-uri? Acest ghid vă acoperă. Faceți clic pentru a Tweet

Cerințe preliminare

În secțiunile următoare, veți afla mai multe despre clientul HTTP al lui Laravel. Pentru a urma, veți avea nevoie de:

  • Cunoștințe de bază despre Laravel, PHP și API-uri
  • PHP și Composer instalate
  • Poştaş

Cum se fac cereri

Pentru a înțelege cum să utilizați un client HTTP pentru a face o solicitare, puteți utiliza o mulțime de API-uri găzduite, cum ar fi ReqRes.

Începeți prin a importa pachetul HTTP inclus la crearea aplicației. În interiorul fișierului App/Http/Controllers/UserController.php , adăugați următorul cod, începând cu instrucțiunea use de la începutul fișierului și codul rămas în interiorul funcției index.

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

Notă: Pentru cazurile de utilizare complexe, puteți trimite și cererea cu anteturi utilizând metoda withHeaders .

În același fișier, creați o nouă metodă de post folosind codul de mai jos:

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

Apoi adăugați o rută pentru aceasta în fișierul routes/web.php :

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

Acum, Postman poate fi folosit pentru a testa această rută. Deschideți Postman și adăugați http://127.0.0.1:8000/post ca adresă URL, cu tipul de solicitare ca GET . După ce faceți clic pe trimite , veți vedea următorul răspuns:

Efectuarea de cereri folosind Postman
Efectuarea de cereri folosind Postman

Cereri concurente

Solicitările paralele îmbunătățesc semnificativ performanța, deoarece puteți prelua mai multe date în aceeași perioadă. Clientul HTTP al lui Laravel face posibilă efectuarea cererilor concurente folosind metoda pool.

În interiorul App/Http/Controllers/UserController.php , adăugați următorul cod:

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

Apoi, adăugați ruta de suport în fișierul routes/web.php .

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

Browserul dă următorul răspuns când este vizitată ruta:

Cereri concurente
Cereri concurente

Solicitați macrocomenzi

Macrocomenzile de solicitare sunt utile atunci când interacționați cu căile API obișnuite.

Pentru a crea macro-ul, trebuie să definiți macro-ul în cadrul metodei de pornire a fișierului app/Http/Providers/AppServiceProvider.php folosind codul de mai jos:

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

Notă: Asigurați-vă că adăugați instrucțiunea de utilizare la începutul fișierului.

Apoi, utilizați macrocomanda din UserController adăugând următorul cod:

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

După cum puteți vedea, deoarece macro-ul este deja creată, nu trebuie să adăugați din nou adresa URL completă.

În cele din urmă, adăugați o rută în fișierul routes/web.php folosind codul de mai jos:

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

Cum să decodificați răspunsurile

Pentru a decoda un răspuns și a vă asigura că o solicitare API are succes, utilizați metoda de stare inclusă în client. Această metodă primește codul de stare trimis de la server și îl afișează.

Pentru a testa acest lucru, înlocuiți codul macro anterior cu codul de mai jos în fișierul App/Http/Controllers/UserController.php :

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

Aici, codul de stare 200 înseamnă că solicitarea a avut succes.

Răspuns de decodare de succes
Răspuns de decodare de succes

Cum să testați API-urile JSON

Laravel are mai mulți asistenți pentru a testa API-urile JSON și răspunsurile acestora. Funcțiile de ajutor includ json , getJson , postJson , putJson , patchJson , deleteJson și așa mai departe.

Pentru a înțelege mai bine Testarea, creați un scenariu de testare pentru ruta utilizatorului GET . Când porniți aplicația Laravel, exemplul de test este deja creat. În interiorul fișierului tests/Feature/ExampleTest.php , înlocuiți codul existent cu următorul:

 <?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); } }

Codul adăugat preia datele JSON la ruta utilizatorului și verifică dacă codul de stare este 200 sau nu.

După ce ați adăugat codul de testare, rulați următoarea comandă în terminal pentru a rula testele:

 ./vendor/bin/phpunit

Odată ce testele sunt finalizate, veți vedea că a rulat două teste, ambele au avut succes.

Testarea API-urilor JSON
Testarea API-urilor JSON

În mod similar, puteți verifica diferite tipuri de solicitări și puteți utiliza alte metode de ajutor pentru testare mai sofisticată.

Cum să gestionați evenimentele

Laravel oferă trei evenimente pentru a fi declanșate atunci când se ocupă de solicitări HTTP.

  • RequestSending , care este înainte ca cererea să fie trimisă.
  • ResponseReceived , care este momentul în care se primește un răspuns.
  • ConnectionFailed , adică atunci când nu se primește niciun răspuns.

Toate cele trei evenimente includ proprietatea $request pentru a inspecta instanța Illuminate\Http\Client\Request , iar ResponseReceived are o $response property . Acestea sunt utile în special pentru a efectua acțiuni după un eveniment. De exemplu, este posibil să doriți să trimiteți un e-mail după ce ați primit un răspuns de succes.

Pentru a crea un eveniment și un ascultător, navigați la fișierul app/Providers/EventServiceProvider.php și înlocuiți matricea de ascultare cu următorul cod.

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

Apoi rulați următoarea comandă în terminalul dvs.:

 php artisan event:generate

Comanda de mai sus va crea ascultătorul app/Listeners/LogResponseReceived.php . Înlocuiți codul acelui fișier cu codul de mai jos:

 <?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) { } }

Jurnalul de informații al codului de stare este tipărit în terminal.

Jurnalele terminalului care arată codul de stare
Jurnalele terminalului care arată codul de stare

Combină puterea lui Laravel și Guzzle pentru o experiență API fără probleme. Sunteți gata să vă creșteți abilitățile de dezvoltator web? Începeți de aici Faceți clic pentru a trimite un Tweet

rezumat

Indiferent dacă un site web sau o aplicație web este realizată de o organizație sau de un dezvoltator independent, API-urile sunt cheia succesului lor. Cu toate acestea, utilizarea lor poate fi dificilă.

Multe cadre și biblioteci promit să simplifice acest proces, dar Laravel se remarcă prin concentrarea pe simplitate și ușurință în utilizare. Clientul lor încorporat acceptă apeluri API simple, apeluri API concurente, macrocomenzi API, metode de ajutor pentru API-uri bazate pe JSON și multe altele.