Laravel maakt API interacties een fluitje van een cent voor zowel nieuwe als ervaren webdevelopers. De Larvel HTTP client is gebouwd bovenop PHP’s Guzzle HTTP client om developers een soepelere ervaring te geven bij het doen van HTTP verzoeken. De belangrijkste kenmerken zijn authenticatie, routing en effectieve object-relational mapping (ORM).

Dit artikel verkent het gebruik van Laravels HTTP client om verzoeken te doen, antwoorden te debuggen, middleware en macro’s te maken, en meer.

Laravel HTTP client doet het zware werk voor je voor API’s

Guzzle is een eenvoudige HTTP client voor PHP. Het biedt functionaliteit voor verschillende formulierverzoeken, waaronder GET, POST, PUT, en DELETE naast streamingmogelijkheden en meerdelige verzoeken. De Guzzle HTTP client maakt het versturen van synchrone en asynchrone verzoeken naar de server mogelijk. Verder wordt het ook geleverd met degelijke middleware om het gedrag van de client aan te passen.

De Laravel HTTP client is een wrapper gebouwd op Guzzle, maar met extra functionaliteiten. Het bevat ondersteuning voor het opnieuw proberen van mislukte verzoeken en enkele hulpfuncties met JSON gegevens. De meeste functionaliteiten van Laravel HTTP clients zijn vergelijkbaar met Guzzle.

Voorwaarden

In de volgende secties leer je meer over de HTTP client van Laravel. Om mee te volgen heb je nodig:

Verzoeken doen

Om te begrijpen hoe je een HTTP client gebruikt om een verzoek te doen, kun je veel gehoste API’s gebruiken, zoals ReqRes.

Begin met het importeren van het HTTP pakket dat bij het maken van de applicatie is meegeleverd. Voeg in het bestand App/Http/Controllers/UserController.php de volgende code toe, te beginnen met het use statement aan het begin van het bestand en de overige code in de indexfunctie.

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

Opmerking: Voor complexe use cases kun je het verzoek ook met headers versturen door de methode withHeaders te gebruiken.

Maak in hetzelfde bestand een nieuwe methode post met onderstaande code:

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

Voeg er vervolgens een route voor toe binnen het bestand routes/web.php:

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

Nu kan Postman gebruikt worden om deze route te testen. Open Postman en voeg http://127.0.0.1:8000/post toe als URL, met het type verzoek als GET. Zodra je op send klikt, zie je het volgende antwoord:

Verzoeken doen met behulp van Postman
Verzoeken doen met behulp van Postman

Parallele verzoeken

Parallelle verzoeken verbeteren de prestaties aanzienlijk, omdat je meer gegevens kunt ophalen in dezelfde periode. De HTTP client van Laravel maakt het mogelijk om gelijktijdige verzoeken uit te voeren met behulp van de poolmethode.

Voeg binnen App/Http/Controllers/UserController.php de volgende code toe:

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

Voeg vervolgens de ondersteunende route toe binnen het bestand routes/web.php.

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

De browser geeft de volgende respons wanneer de route wordt bezocht:

Parallele verzoeken
Parallele verzoeken

Request macro’s

Request macro’s zijn handig bij interactie met veelgebruikte API paden.

Om de macro te maken, moet je hem definiëren in de bootmethode van het bestand app/Http/Providers/AppServiceProvider.php met de onderstaande code:

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

Opmerking: Zorg ervoor dat je het use statement aan het begin van het bestand toevoegt.

Gebruik vervolgens de macro in de UserController door de volgende code toe te voegen:

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

Zoals je ziet, hoef je de volledige URL niet opnieuw toe te voegen, omdat de macro al wordt aangemaakt,

Voeg ten slotte een route toe in het bestand routes/web.php met de onderstaande code:

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

Responses decoderen

Om een respons te decoderen en ervoor te zorgen dat een API verzoek succesvol is, gebruik je de statusmethode die in de client is opgenomen. Deze methode krijgt de statuscode die van de server wordt verzonden en geeft die weer.

Om dit te testen vervang je de vorige macrocode door onderstaande code binnen het App/Http/Controllers/UserController.php bestand:

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

Hier betekent de statuscode 200 dat het verzoek succesvol was.

Succesvolle decoding respons
Succesvolle decoding respons

Zo test je JSON API’s

Laravel heeft verschillende helpers om de JSON API’s en hun responses te testen. De helper functies zijn onder andere json, getJson, postJson, putJson, patchJson, deleteJson, enzovoort.

Om het testen beter te begrijpen, maak je een testscenario voor de route van de GET gebruiker. Wanneer je de Laravel applicatie bootstrapt, is de Example Test al aangemaakt. Vervang binnen het bestand Tests/Feature/ExampleTest.php de bestaande code door het volgende:

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

De toegevoegde code haalt de JSON gegevens op bij de route van de gebruiker en controleert of de statuscode 200 is of niet.

Zodra je de testcode hebt toegevoegd, voer je in je terminal het volgende commando uit om de tests uit te voeren:

./vendor/bin/phpunit

Als de tests zijn voltooid, zie je dat het twee tests uitvoerde, die beide succesvol waren.

JSON API's testen
JSON API’s testen

Op dezelfde manier kun je controleren op verschillende soorten verzoeken en andere helper methoden gebruiken voor meer verfijnde tests.

Zo deal je met events

Laravel biedt drie events om af te vuren bij HTTP verzoeken.

  • RequestSending, dat is voordat het verzoek wordt verzonden.
  • ResponseReceived, wanneer een antwoord wordt ontvangen.
  • ConnectionFailed, als er geen antwoord is ontvangen.

Alle drie de events bevatten de property $request om de instantie Illuminate\Http\Client\Request te inspecteren, en ResponseReceived heeft een extra $response property. Deze zijn vooral nuttig voor het uitvoeren van acties na een event. Je zou bijvoorbeeld kunnen mailen na het krijgen van een succesvolle respons.

Om een event en listener te maken, navigeer je naar het bestand app/Providers/EventServiceProvider.php en vervang je de listen array door de volgende code.

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

Voer nu het volgende commando uit in je terminal:

php artisan event:generate

Het bovenstaande commando zal de luisteraar app/Listeners/LogResponseReceived.php aanmaken. Vervang de code van dat bestand door onderstaande code:

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

De info log van de statuscode wordt nu getoond in de terminal.

Terminallogs die de statuscode tonen
Terminallogs die de statuscode tonen

Samenvatting

Of een website of webapplicatie nu gemaakt is door een organisatie of een onafhankelijke developer, API’s zijn de sleutel tot het succes ervan. Het gebruik ervan kan echter moeilijk zijn.

Veel frameworks en bibliotheken beloven dit proces te vereenvoudigen, maar Laravel onderscheidt zich door zijn focus op eenvoud en gebruiksgemak. Hun ingebouwde client ondersteunt eenvoudige API calls, gelijktijdige API calls, API-macro’s, helper-methoden voor JSON gebaseerde API’s, en meer.

Steve Bonisteel Kinsta

Steve Bonisteel is Technical Editor bij Kinsta. Hij begon zijn schrijverscarrière als verslaggever en achtervolgde ambulances en brandweerwagens. Sinds eind jaren negentig schrijft hij over internetgerelateerde technologie.