Harici API'lerle Etkileşim İçin Laravel'in Yerleşik İstemcisini Kullanma
Yayınlanan: 2023-04-24Laravel, API etkileşimlerini hem yeni hem de deneyimli web geliştiricileri için çocuk oyuncağı haline getirir. Larvel HTTP istemcisi, geliştiricilere HTTP istekleri yaparken daha sorunsuz bir deneyim sağlamak için PHP'nin Guzzle HTTP istemcisi üzerine kurulmuştur. Birincil özellikleri, kimlik doğrulama, yönlendirme ve etkili nesne-ilişkisel eşlemeyi (ORM) içerir.
Bu makale, isteklerde bulunmak, yanıtlarda hata ayıklamak, ara yazılım ve makrolar oluşturmak ve daha fazlası için Laravel'in HTTP istemcisini kullanmayı keşfedecektir.
API'ler için Zor İşi Sizin Yerinize Laravel HTTP İstemcisi Yapar
Guzzle, PHP için basit bir HTTP istemcisidir. Akış yetenekleri ve çok parçalı isteklerin yanı sıra GET
, POST
, PUT
ve DELETE
dahil olmak üzere farklı form istekleri için işlevsellik sunar. Guzzle HTTP istemcisi ile sunucuya senkron ve asenkron istekler göndermek mümkündür. Ayrıca, müşterinin davranışını özelleştirmek için uygun ara katman yazılımıyla birlikte gelir.
Laravel'in HTTP istemcisi, Guzzle üzerinde oluşturulmuş ancak ekstra işlevlere sahip bir sarmalayıcıdır. Başarısız isteklerin yeniden denenmesi için destek ve JSON verileriyle bazı yardımcı işlevler içerir. Laravel HTTP istemcilerinin işlevlerinin çoğu Guzzle'a benzer.
Önkoşullar
Aşağıdaki bölümlerde, Laravel'in HTTP istemcisi hakkında daha fazla bilgi edineceksiniz. Takip etmek için ihtiyacınız olacak:
- Laravel, PHP ve API'ler hakkında temel bilgi
- PHP ve Composer yüklü
- postacı
İstek Nasıl Yapılır?
Bir istekte bulunmak için bir HTTP istemcisinin nasıl kullanılacağını anlamak için, ReqRes gibi çok sayıda barındırılan API'den yararlanabilirsiniz.
Uygulamayı oluştururken dahil edilen HTTP paketini içe aktararak başlayın. App/Http/Controllers/UserController.php dosyasının içine, dosyanın başındaki use deyiminden başlayarak ve index işlevinde kalan koddan başlayarak aşağıdaki kodu ekleyin.
use Illuminate\Support\Facades\Http; return Http::get("https://reqres.in/api/users?page=2");
Not: Karmaşık kullanım durumları için, withHeaders
yöntemini kullanarak isteği başlıklarla da gönderebilirsiniz.
Aynı dosyada, aşağıdaki kodu kullanarak yeni bir yöntem gönderisi oluşturun:
function post() { $response = Http::withHeaders([ 'Content-Type' => 'application/json', ])->post('https://reqres.in/api/users', [ 'name' => 'morpheus', 'job' => 'leader', ]); return $response; }
Ardından, onun için route/web.php dosyasının içine bir rota ekleyin:
Route::get('post',[UserController::class,'post']);
Şimdi, Postman bu rotayı test etmek için kullanılabilir. Postman'ı açın ve URL olarak http://127.0.0.1:8000/post'u istek türü olarak GET
olarak ekleyin. Gönder'i tıkladığınızda, aşağıdaki yanıtı görürsünüz:
Eşzamanlı İstekler
Paralel istekler, aynı dönemde daha fazla veri alabildiğiniz için performansı önemli ölçüde artırır. Laravel'in HTTP istemcisi, havuz yöntemini kullanarak eşzamanlı istekleri gerçekleştirmeyi mümkün kılar.
App/Http/Controllers/UserController.php içine aşağıdaki kodu ekleyin:
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(); }
Sonra, destekleyici yolu, route/web.php dosyasının içine ekleyin.
Route::get('concurrent',[UserController::class,'concurrent']);
Rota ziyaret edildiğinde tarayıcı aşağıdaki yanıtı verir:
Makro İste
İstek makroları, ortak API yollarıyla etkileşim kurarken kullanışlıdır.
Makro oluşturmak için, aşağıdaki kodu kullanarak makroyu app/Http/Providers/AppServiceProvider.php dosyasının önyükleme yöntemi içinde tanımlamanız gerekir:
use Illuminate\Support\Facades\Http; Http::macro('reqres', function () { return Http::baseUrl('https://reqres.in/api'); });
Not: Use deyimini dosyanın başına eklediğinizden emin olun.
Ardından, aşağıdaki kodu ekleyerek UserController
içindeki makroyu kullanın:
function macro() { $response = Http::reqres()->get('/users?page=2'); return $response; }
Gördüğünüz gibi, makro halihazırda oluşturulmakta olduğu için tam URL'yi yeniden eklemeniz gerekmez.
Son olarak, route/web.php dosyasına aşağıdaki kodu kullanarak bir rota ekleyin:
Route::get('macro',[UserController::class,'macro']);
Yanıtların Kodu Nasıl Çözülür?
Bir yanıtın kodunu çözmek ve bir API isteğinin başarılı olduğundan emin olmak için istemcide bulunan durum yöntemini kullanırsınız. Bu yöntem, sunucudan gönderilen durum kodunu alır ve görüntüler.
Bunu test etmek için önceki makro kodunu App/Http/Controllers/UserController.php dosyasının içindeki aşağıdaki kodla değiştirin:
function macro() { $response = Http::reqres()->get('/users?page=2'); return $response->status(); }
Burada durum kodu 200, isteğin başarılı olduğu anlamına gelir.
JSON API'leri Nasıl Test Edilir?
Laravel, JSON API'lerini ve bunların yanıtlarını test etmek için birkaç yardımcıya sahiptir. Yardımcı işlevler arasında json , getJson , postJson , putJson , patchJson , deleteJson vb. bulunur.
Testi daha iyi anlamak için, GET
kullanıcısının rotası için bir test senaryosu oluşturun. Laravel uygulamasını önyüklediğinizde, Örnek Test zaten oluşturulmuştur. testler/Feature/ExampleTest.php dosyasının içinde mevcut kodu aşağıdakiyle değiştirin:
<?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); } }
Eklenen kod, kullanıcının rotasındaki JSON verilerini getirir ve durum kodunun 200 olup olmadığını kontrol eder.
Test kodunu ekledikten sonra, testleri çalıştırmak için terminalinizde aşağıdaki komutu çalıştırın:
./vendor/bin/phpunit
Testler tamamlandığında, her ikisi de başarılı olan iki test gerçekleştirdiğini göreceksiniz.
Benzer şekilde, farklı istek türlerini kontrol edebilir ve daha karmaşık testler için diğer yardımcı yöntemleri kullanabilirsiniz.
Olaylar Nasıl İşlenir?
Laravel, HTTP istekleriyle uğraşırken tetiklenecek üç olay sunar.
- İstek gönderilmeden önce olan RequestSending .
- ResponseRequired , bir yanıt alındığında.
- ConnectionFailed , yanıt alınmadığında ortaya çıkar.
Üç olayın tümü Illuminate\Http\Client\Request
örneğini denetlemek için $request
özelliğini içerir ve ResponseReceived
ek bir $response property
sahiptir. Bunlar, bir olaydan sonra eylemleri gerçekleştirmek için özellikle kullanışlıdır. Örneğin, başarılı bir yanıt aldıktan sonra e-posta göndermek isteyebilirsiniz.
Bir olay ve dinleyici oluşturmak için app/Providers/EventServiceProvider.php dosyasına gidin ve listen dizisini aşağıdaki kodla değiştirin.
protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, ], 'Illuminate\Http\Client\Events\ResponseReceived' => [ 'App\Listeners\LogResponseReceived', ], ];
Ardından terminalinizde aşağıdaki komutu çalıştırın:
php artisan event:generate
Yukarıdaki komut , app/Listeners/LogResponseRequired.php dinleyicisini yaratacaktır. Bu dosyanın kodunu aşağıdaki kodla değiştirin:
<?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) { } }
Durum kodunun bilgi günlüğü terminalde yazdırılır.
Özet
Bir web sitesi veya web uygulaması ister bir kuruluş, ister bağımsız bir geliştirici tarafından yapılmış olsun, API'ler başarılarının anahtarıdır. Ancak bunları kullanmak zor olabilir.
Pek çok çerçeve ve kitaplık bu süreci basitleştirmeyi vaat ediyor, ancak Laravel basitliğe ve kullanım kolaylığına odaklanmasıyla öne çıkıyor. Yerleşik istemcileri, kolay API çağrılarını, eşzamanlı API çağrılarını, API Makrolarını, JSON tabanlı API'ler için yardımcı yöntemleri ve daha fazlasını destekler.