Laravel gør API-interaktioner til en leg for både nye og erfarne webudviklere. Larvel HTTP-klienten er bygget oven på PHP’s Guzzle HTTP-klient for at give udviklere en mere smidig oplevelse, når de laver HTTP-forespørgsler. Dens primære funktioner omfatter autentificering, routing og effektiv objekt-relationel mapping (ORM).

Denne artikel vil undersøge brugen af Laravels HTTP-klient til at foretage anmodninger, debugge svar, oprette middleware og makroer og meget mere.

Laravel HTTP-klient gør det hårde arbejde for dig til API’er

Guzzle er en simpel HTTP-klient til PHP. Den tilbyder funktionalitet til forskellige formularforespørgsler, herunder GET, POST, PUT og DELETE sammen med streamingfunktioner og multipartforespørgsler. Med Guzzle HTTP-klienten er det muligt at sende synkrone og asynkrone anmodninger til serveren. Desuden leveres den også med anstændig middleware til at tilpasse klientens adfærd.

Laravels HTTP-klient er en wrapper bygget på Guzzle, men med ekstra funktionaliteter. Den indeholder understøttelse af retrying af mislykkede anmodninger og nogle hjælpefunktioner med JSON-data. De fleste af funktionaliteterne i Laravel HTTP-klienter svarer til Guzzle.

Forudsætninger

I de følgende afsnit lærer du mere om Laravels HTTP-klient. Du skal bruge følgende for at følge med:

  • Grundlæggende kendskab til Laravel, PHP og API’er
  • PHP og Composer installeret
  • Postman

Sådan laver du forespørgsler

For at forstå, hvordan man bruger en HTTP-klient til at lave en anmodning, kan du udnytte masser af hostede API’er, såsom ReqRes.

Start med at importere den HTTP-pakke, der er medtaget, da du oprettede programmet. Inde i filen App/Http/Controllers/UserController.php skal du tilføje følgende kode, begyndende med use-erklæringen i begyndelsen af filen og den resterende kode inde i index-funktionen.

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

Bemærk: For komplekse brugssituationer kan du også sende anmodningen med overskrifter ved hjælp af metoden withHeaders.

I den samme fil skal du oprette en ny metode post med nedenstående kode:

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

Tilføj derefter en rute til den i filen routes/web.php:

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

Nu kan Postman bruges til at teste denne rute. Åbn Postman, og tilføj http://127.0.0.1:8000/post som URL, med forespørgselstypen GET. Når du klikker på send, vil du se følgende svar:

Udarbejdelse af anmodninger ved hjælp af Postman
Udarbejdelse af anmodninger ved hjælp af Postman

Samtidige anmodninger

Parallelle anmodninger forbedrer ydeevnen betydeligt, da du kan hente flere data i samme periode. Laravels HTTP-klient gør det muligt at udføre samtidige forespørgsler ved hjælp af pool-metoden.

Inde i App/Http/Controllers/UserController.php skal du tilføje følgende kode:

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

Derefter tilføjes den understøttende rute i filen routes/web.php.

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

Browseren giver følgende svar, når ruten besøges:

Samtidige anmodninger
Samtidige anmodninger

Anmodningsmakroer

Anmodningsmakroer er nyttige, når du interagerer med almindelige API-stier.

For at oprette makroen skal du definere makroen inde i boot-metoden i filen app/Http/Providers/AppServiceProvider.php ved hjælp af nedenstående kode:

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

Bemærk: Sørg for at tilføje use-erklæringen i begyndelsen af filen.

Derefter skal du bruge makroen inde i UserController ved at tilføje følgende kode:

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

Som du kan se, behøver du ikke at tilføje den fulde URL-adresse igen, fordi makroen allerede er oprettet.

Til sidst skal du tilføje en rute i filen routes/web.php ved hjælp af nedenstående kode:

Route::get('macro',[UserController::class,'macro']);
Makroforespørgsel
Makroforespørgsel

Sådan afkoder du svarene

For at afkode et svar og sikre, at en API-forespørgsel er vellykket, skal du bruge statusmetoden, der er inkluderet i klienten. Denne metode henter den statuskode, der er sendt fra serveren, og viser den.

For at afprøve dette skal du erstatte den tidligere makrokode med nedenstående kode inde i filen App/Http/Controllers/UserController.php:

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

Her betyder statuskoden 200, at anmodningen var vellykket.

Vellykket afkodningssvar
Vellykket afkodningssvar

Sådan tester du JSON API’er

Laravel har flere hjælpere til at teste JSON-API’er og deres svar. Hjælperfunktionerne omfatter json, getJson, postJson, putJson, patchJson, deleteJson osv.

For at forstå testen bedre skal du oprette et testscenarie for GET -brugerens rute. Når du bootstrapper Laravel-applikationen, er Eksempletest allerede oprettet. Inde i filen tests/Feature/ExampleTest.php skal du erstatte den eksisterende kode med følgende:

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

Den tilføjede kode henter JSON-dataene på brugerens rute og kontrollerer, om statuskoden er 200 eller ej.

Når du har tilføjet testkoden, skal du køre følgende kommando i din terminal for at køre testene:

./vendor/bin/phpunit

Når testene er færdige, kan du se, at den kørte to test, som begge var vellykkede.

Test af JSON-API'er
Test af JSON-API’er

På samme måde kan du kontrollere forskellige typer anmodninger og bruge andre hjælpemetoder til mere sofistikerede test.

Sådan håndteres begivenheder

Laravel tilbyder tre hændelser, der skal affyres, når du håndterer HTTP-forespørgsler.

  • RequestSending, som er før anmodningen sendes.
  • ResponseReceived, som er når et svar er modtaget.
  • ConnectionFailed, som er, når der ikke modtages noget svar.

Alle tre hændelser omfatter $request -egenskaben til at inspicere Illuminate\Http\Client\Request -instansen, og ResponseReceived har en ekstra $response property. Disse er især nyttige til at udføre handlinger efter en hændelse. Du kan f.eks. ønske at sende en e-mail, når du har modtaget et vellykket svar.

Hvis du vil oprette en begivenhed og en lytter, skal du navigere til filen app/Providers/EventServiceProvider.php og erstatte listen-arrayet med følgende kode.

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

Kør derefter følgende kommando i din terminal:

php artisan event:generate

Ovenstående kommando vil oprette lytteren app/Listeners/LogResponseReceived.php. Udskift koden i denne fil med nedenstående kode:

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

Info-loggen med statuskoden udskrives i terminalen.

Terminal logs, der viser statuskoden
Terminal logs, der viser statuskoden

Opsummering

Uanset om et websted eller en webapplikation er lavet af en organisation eller en uafhængig udvikler, er API’er afgørende for deres succes. Det kan dog være svært at bruge dem.

Mange frameworks og biblioteker lover at forenkle denne proces, men Laravel skiller sig ud for sit fokus på enkelhed og brugervenlighed. Deres indbyggede klient understøtter nemme API-kald, samtidige API-kald, API-makroer, hjælpe-metoder til JSON-baserede API’er og meget mere.

Steve Bonisteel Kinsta

"Steve Bonisteel er en teknisk redaktør hos Kinsta, der begyndte sin forfatterkarriere som journalist på en avis, der jagtede ambulancer og brandbiler. Han har dækket internetrelateret teknologi siden slutningen af 1990'erne."