So verwenden Sie den integrierten Client von Laravel zur Interaktion mit externen APIs

Veröffentlicht: 2023-04-24

Laravel macht API-Interaktionen sowohl für neue als auch für erfahrene Webentwickler zum Kinderspiel. Der Larvel-HTTP-Client baut auf dem Guzzle-HTTP-Client von PHP auf, um Entwicklern ein reibungsloseres Erlebnis bei HTTP-Anforderungen zu bieten. Zu den Hauptfunktionen gehören Authentifizierung, Routing und effektives objektrelationales Mapping (ORM).

In diesem Artikel wird die Verwendung des HTTP-Clients von Laravel untersucht, um Anforderungen zu stellen, Antworten zu debuggen, Middleware und Makros zu erstellen und vieles mehr.

Laravel HTTP Client erledigt die harte Arbeit für Sie für APIs

Guzzle ist ein einfacher HTTP-Client für PHP. Es bietet Funktionen für verschiedene Formularanforderungen, einschließlich GET , POST , PUT und DELETE neben den Streaming-Funktionen und mehrteiligen Anforderungen. Mit dem Guzzle-HTTP-Client ist das Senden von synchronen und asynchronen Anfragen an den Server möglich. Darüber hinaus wird es mit anständiger Middleware geliefert, um das Verhalten des Clients anzupassen.

Der HTTP-Client von Laravel ist ein Wrapper, der auf Guzzle basiert, aber über zusätzliche Funktionen verfügt. Es enthält Unterstützung für die Wiederholung fehlgeschlagener Anforderungen und einige Hilfsfunktionen mit JSON-Daten. Die meisten Funktionen von Laravel-HTTP-Clients ähneln denen von Guzzle.

Holen Sie das Beste aus dem integrierten Client von Laravel für API-Interaktionen heraus! Neu bei APIs? Dieser Leitfaden hat Sie abgedeckt Click to Tweet

Voraussetzungen

In den folgenden Abschnitten erfahren Sie mehr über den HTTP-Client von Laravel. Um mitzumachen, benötigen Sie:

  • Grundkenntnisse in Laravel, PHP und APIs
  • PHP und Composer installiert
  • Briefträger

So stellen Sie Anfragen

Um zu verstehen, wie ein HTTP-Client verwendet wird, um eine Anfrage zu stellen, können Sie zahlreiche gehostete APIs wie ReqRes nutzen.

Beginnen Sie mit dem Importieren des HTTP-Pakets, das beim Erstellen der Anwendung enthalten ist. Fügen Sie in der Datei App/Http/Controllers/UserController.php den folgenden Code hinzu, beginnend mit der use-Anweisung am Anfang der Datei und dem restlichen Code in der index-Funktion.

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

Hinweis: Für komplexe Anwendungsfälle können Sie die Anfrage auch mit Headern senden, indem Sie die Methode withHeaders verwenden.

Erstellen Sie in derselben Datei einen neuen Methodenpost mit dem folgenden Code:

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

Fügen Sie dann eine Route dafür in der Datei routes/web.php hinzu:

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

Jetzt kann Postman verwendet werden, um diese Route zu testen. Öffnen Sie Postman und fügen Sie http://127.0.0.1:8000/post als URL mit dem Anfragetyp als GET hinzu. Nachdem Sie auf Senden geklickt haben, sehen Sie die folgende Antwort:

Anfragen mit Postman stellen
Anfragen mit Postman stellen

Gleichzeitige Anfragen

Parallele Anfragen verbessern die Leistung erheblich, da Sie im gleichen Zeitraum mehr Daten abrufen können. Der HTTP-Client von Laravel ermöglicht es, gleichzeitige Anfragen nach der Pool-Methode durchzuführen.

Fügen Sie in App/Http/Controllers/UserController.php den folgenden Code hinzu:

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

Fügen Sie dann die unterstützende Route in der Datei "routes/web.php" hinzu.

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

Der Browser gibt beim Besuch der Route folgende Antwort:

Gleichzeitige Anfragen
Gleichzeitige Anfragen

Makros anfordern

Anforderungsmakros sind nützlich, wenn mit allgemeinen API-Pfads interagiert wird.

Um das Makro zu erstellen, müssen Sie das Makro in der Boot-Methode der Datei app/Http/Providers/AppServiceProvider.php mit dem folgenden Code definieren:

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

Hinweis: Achten Sie darauf, die use-Anweisung am Anfang der Datei hinzuzufügen.

Verwenden Sie dann das Makro im UserController , indem Sie den folgenden Code hinzufügen:

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

Wie Sie sehen können, müssen Sie die vollständige URL nicht erneut hinzufügen, da das Makro bereits erstellt wird.

Zuletzt fügen Sie eine Route in der Datei "routes/web.php" hinzu, indem Sie den folgenden Code verwenden:

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

So decodieren Sie Antworten

Um eine Antwort zu entschlüsseln und sicherzustellen, dass eine API-Anforderung erfolgreich ist, verwenden Sie die im Client enthaltene Statusmethode. Diese Methode ruft den vom Server gesendeten Statuscode ab und zeigt ihn an.

Um dies zu testen, ersetzen Sie den vorherigen Makrocode durch den folgenden Code in der Datei App/Http/Controllers/UserController.php :

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

Hier bedeutet der Statuscode 200, dass die Anfrage erfolgreich war.

Erfolgreiche Dekodierungsantwort
Erfolgreiche Dekodierungsantwort

So testen Sie JSON-APIs

Laravel hat mehrere Helfer, um die JSON-APIs und ihre Antworten zu testen. Zu den Hilfsfunktionen gehören json , getJson , postJson , putJson , patchJson , deleteJson und so weiter.

Um das Testen besser zu verstehen, erstellen Sie ein Testszenario für die Route des GET Benutzers. Wenn Sie die Laravel-Anwendung booten, ist der Beispieltest bereits erstellt. Ersetzen Sie in der Datei tests/Feature/ExampleTest.php den vorhandenen Code durch Folgendes:

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

Der hinzugefügte Code ruft die JSON-Daten auf der Route des Benutzers ab und prüft, ob der Statuscode 200 ist oder nicht.

Nachdem Sie den Testcode hinzugefügt haben, führen Sie den folgenden Befehl in Ihrem Terminal aus, um die Tests auszuführen:

 ./vendor/bin/phpunit

Sobald die Tests abgeschlossen sind, sehen Sie, dass zwei Tests ausgeführt wurden, die beide erfolgreich waren.

Testen von JSON-APIs
Testen von JSON-APIs

Ebenso können Sie nach verschiedenen Arten von Anfragen suchen und andere Hilfsmethoden für anspruchsvollere Tests verwenden.

Umgang mit Ereignissen

Laravel bietet drei Ereignisse an, die beim Umgang mit HTTP-Anforderungen ausgelöst werden können.

  • RequestSending , also vor dem Senden der Anfrage.
  • ResponseReceived , wenn eine Antwort empfangen wird.
  • ConnectionFailed , wenn keine Antwort empfangen wird.

Alle drei Ereignisse enthalten die $request Eigenschaft, um die Illuminate\Http\Client\Request Instanz zu untersuchen, und ResponseReceived hat eine zusätzliche $response property . Diese sind besonders nützlich, um Aktionen nach einem Ereignis auszuführen. Beispielsweise möchten Sie möglicherweise eine E-Mail senden, nachdem Sie eine erfolgreiche Antwort erhalten haben.

Um ein Ereignis und einen Listener zu erstellen, navigieren Sie zur Datei app/Providers/EventServiceProvider.php und ersetzen Sie das Listen-Array durch den folgenden Code.

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

Führen Sie dann den folgenden Befehl in Ihrem Terminal aus:

 php artisan event:generate

Der obige Befehl erstellt den Listener app/Listeners/LogResponseReceived.php . Ersetzen Sie den Code dieser Datei durch den folgenden 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) { } }

Das Infoprotokoll des Statuscodes wird im Terminal ausgedruckt.

Terminalprotokolle mit Statuscode
Terminalprotokolle mit Statuscode

Kombinieren Sie die Leistungsfähigkeit von Laravel und Guzzle für ein nahtloses API-Erlebnis. Sind Sie bereit, Ihre Webentwicklungsfähigkeiten zu verbessern? Beginnen Sie hier Klicken Sie, um zu twittern

Zusammenfassung

Unabhängig davon, ob eine Website oder Webanwendung von einer Organisation oder einem unabhängigen Entwickler erstellt wird, sind APIs der Schlüssel zu ihrem Erfolg. Ihre Verwendung kann jedoch schwierig sein.

Viele Frameworks und Bibliotheken versprechen, diesen Prozess zu vereinfachen, aber Laravel zeichnet sich durch seinen Fokus auf Einfachheit und Benutzerfreundlichkeit aus. Ihr integrierter Client unterstützt einfache API-Aufrufe, gleichzeitige API-Aufrufe, API-Makros, Hilfsmethoden für JSON-basierte APIs und mehr.