วิธีใช้ไคลเอนต์ในตัวของ Laravel เพื่อโต้ตอบกับ API ภายนอก

เผยแพร่แล้ว: 2023-04-24

Laravel ทำให้การโต้ตอบกับ API เป็นเรื่องง่ายสำหรับนักพัฒนาเว็บทั้งมือใหม่และผู้มีประสบการณ์ ไคลเอนต์ Larvel HTTP สร้างขึ้นบนไคลเอนต์ Guzzle HTTP ของ PHP เพื่อให้นักพัฒนาได้รับประสบการณ์ที่ราบรื่นยิ่งขึ้นเมื่อส่งคำขอ HTTP คุณสมบัติหลัก ได้แก่ การพิสูจน์ตัวตน การกำหนดเส้นทาง และการแมปเชิงสัมพันธ์เชิงวัตถุ (ORM) ที่มีประสิทธิภาพ

บทความนี้จะสำรวจการใช้ไคลเอนต์ HTTP ของ Laravel เพื่อสร้างคำขอ ดีบักการตอบสนอง สร้างมิดเดิลแวร์และมาโคร และอื่นๆ

ไคลเอนต์ Laravel HTTP ทำงานหนักสำหรับคุณสำหรับ API

Guzzle เป็นไคลเอนต์ HTTP อย่างง่ายสำหรับ PHP มีฟังก์ชันสำหรับคำขอแบบฟอร์มต่างๆ รวมถึง GET , POST , PUT และ DELETE ควบคู่ไปกับความสามารถในการสตรีมและคำขอหลายส่วน ด้วยไคลเอนต์ Guzzle HTTP การส่งคำขอแบบซิงโครนัสและอะซิงโครนัสไปยังเซิร์ฟเวอร์เป็นไปได้ นอกจากนี้ยังมาพร้อมกับมิดเดิลแวร์ที่เหมาะสมเพื่อปรับแต่งพฤติกรรมของลูกค้า

ไคลเอนต์ HTTP ของ Laravel เป็น wrapper ที่สร้างขึ้นบน Guzzle แต่มีฟังก์ชันพิเศษ รวมถึงการสนับสนุนการลองคำขอที่ล้มเหลวอีกครั้งและฟังก์ชันตัวช่วยบางอย่างด้วยข้อมูล JSON ฟังก์ชันส่วนใหญ่ของไคลเอนต์ Laravel HTTP นั้นคล้ายกับ Guzzle

รับประโยชน์สูงสุดจากไคลเอนต์ในตัวของ Laravel สำหรับการโต้ตอบกับ API! ใหม่สำหรับ API? คู่มือนี้มีเนื้อหาเกี่ยวกับ Click to Tweet

ข้อกำหนดเบื้องต้น

ในส่วนต่อไปนี้ คุณจะได้เรียนรู้เพิ่มเติมเกี่ยวกับไคลเอนต์ HTTP ของ Laravel ในการติดตามคุณจะต้อง:

  • ความรู้พื้นฐานเกี่ยวกับ Laravel, PHP และ API
  • ติดตั้ง PHP และนักแต่งเพลงแล้ว
  • บุรุษไปรษณีย์

วิธีส่งคำขอ

เพื่อให้เข้าใจวิธีใช้ไคลเอนต์ HTTP เพื่อสร้างคำขอ คุณสามารถใช้ประโยชน์จาก API ที่โฮสต์จำนวนมาก เช่น ReqRes

เริ่มต้นด้วยการอิมพอร์ตแพ็คเกจ HTTP ที่รวมไว้เมื่อสร้างแอปพลิเคชัน ภายในไฟล์ App/Http/Controllers/UserController.php ให้เพิ่มโค้ดต่อไปนี้ โดยเริ่มจากคำสั่งใช้ที่จุดเริ่มต้นของไฟล์และโค้ดที่เหลือในฟังก์ชันดัชนี

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

หมายเหตุ: สำหรับกรณีการใช้งานที่ซับซ้อน คุณยังสามารถส่งคำขอพร้อมส่วนหัวโดยใช้เมธอด withHeaders

ในไฟล์เดียวกัน ให้สร้างโพสต์เมธอดใหม่โดยใช้โค้ดด้านล่าง:

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

จากนั้นเพิ่มเส้นทางภายในไฟล์ route/web.php :

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

ตอนนี้บุรุษไปรษณีย์สามารถใช้ทดสอบเส้นทางนี้ได้ เปิด Postman และเพิ่ม http://127.0.0.1:8000/post เป็น URL โดยมีประเภทคำขอเป็น GET เมื่อคุณคลิก ส่ง คุณจะเห็นข้อความตอบกลับต่อไปนี้:

การร้องขอโดยใช้บุรุษไปรษณีย์
การร้องขอโดยใช้บุรุษไปรษณีย์

คำขอพร้อมกัน

คำขอคู่ขนานช่วยปรับปรุงประสิทธิภาพได้อย่างมากเนื่องจากคุณสามารถดึงข้อมูลได้มากขึ้นในช่วงเวลาเดียวกัน ไคลเอนต์ HTTP ของ Laravel ทำให้สามารถดำเนินการคำขอพร้อมกันโดยใช้วิธีการพูล

ภายใน App/Http/Controllers/UserController.php ให้เพิ่มรหัสต่อไปนี้:

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

จากนั้นเพิ่มเส้นทางที่รองรับภายในไฟล์ route/web.php

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

เบราเซอร์จะตอบสนองต่อไปนี้เมื่อมีการเยี่ยมชมเส้นทาง:

คำขอพร้อมกัน
คำขอพร้อมกัน

ขอมาโคร

มาโครคำขอมีประโยชน์เมื่อโต้ตอบกับเส้นทาง API ทั่วไป

ในการสร้างมาโคร คุณต้องกำหนดมาโครภายในวิธีการบู๊ตของไฟล์ app/Http/Providers/AppServiceProvider.php โดยใช้รหัสด้านล่าง:

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

หมายเหตุ: ตรวจสอบให้แน่ใจว่าได้เพิ่มคำสั่งการใช้งานที่จุดเริ่มต้นของไฟล์

จากนั้น ใช้แมโครภายใน UserController โดยเพิ่มรหัสต่อไปนี้:

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

อย่างที่คุณเห็น เนื่องจากมีการสร้างมาโครแล้ว คุณจึงไม่ต้องเพิ่ม URL แบบเต็มอีกครั้ง

สุดท้าย เพิ่มเส้นทางในไฟล์ route/web.php โดยใช้โค้ดด้านล่าง:

 Route::get('macro',[UserController::class,'macro']);
คำขอมาโคร
คำขอมาโคร

วิธีถอดรหัสคำตอบ

หากต้องการถอดรหัสการตอบกลับและรับรองว่าคำขอ API นั้นสำเร็จ คุณต้องใช้เมธอดสถานะที่รวมอยู่ในไคลเอนต์ เมธอดนี้รับรหัสสถานะที่ส่งจากเซิร์ฟเวอร์และแสดง

หากต้องการทดสอบ ให้แทนที่โค้ดแมโครก่อนหน้าด้วยโค้ดด้านล่างภายในไฟล์ App/Http/Controllers/UserController.php :

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

ที่นี่ รหัสสถานะ 200 หมายถึงคำขอสำเร็จ

การตอบสนองการถอดรหัสที่ประสบความสำเร็จ
การตอบสนองการถอดรหัสที่ประสบความสำเร็จ

วิธีทดสอบ JSON API

Laravel มีผู้ช่วยเหลือหลายคนในการทดสอบ JSON API และการตอบสนอง ฟังก์ชันตัวช่วยประกอบด้วย json , getJson , postJson , putJson , patchJson , deleteJson และอื่นๆ

เพื่อให้เข้าใจการทดสอบได้ดีขึ้น ให้สร้างสถานการณ์ทดสอบสำหรับเส้นทางของผู้ใช้ GET เมื่อคุณบู๊ตแอปพลิเคชัน Laravel การทดสอบตัวอย่าง จะถูกสร้างขึ้นแล้ว ภายในไฟล์ test/Feature/ExampleTest.php ให้แทนที่โค้ดที่มีอยู่ด้วยสิ่งต่อไปนี้:

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

รหัสที่เพิ่มจะดึงข้อมูล JSON ที่เส้นทางของผู้ใช้และตรวจสอบว่ารหัสสถานะคือ 200 หรือไม่

เมื่อคุณเพิ่มโค้ดทดสอบแล้ว ให้รันคำสั่งต่อไปนี้ในเทอร์มินัลเพื่อรันการทดสอบ:

 ./vendor/bin/phpunit

เมื่อการทดสอบเสร็จสิ้น คุณจะเห็นว่ามีการทดสอบ 2 ครั้ง ซึ่งทั้งสองการทดสอบประสบความสำเร็จ

การทดสอบ JSON API
การทดสอบ JSON API

ในทำนองเดียวกัน คุณสามารถตรวจสอบคำขอประเภทต่างๆ และใช้วิธีการช่วยเหลืออื่นๆ สำหรับการทดสอบที่ซับซ้อนยิ่งขึ้น

วิธีจัดการกับเหตุการณ์

Laravel เสนอสามเหตุการณ์ที่จะเริ่มทำงานเมื่อจัดการกับคำขอ HTTP

  • RequestSending ซึ่งก่อนส่งคำขอ
  • ResponseReceived คือเมื่อได้รับการตอบกลับ
  • ConnectionFailed คือเมื่อไม่ได้รับการตอบสนอง

ทั้งสามเหตุการณ์รวมถึงคุณสมบัติ $request เพื่อตรวจสอบ Illuminate\Http\Client\Request และ ResponseReceived มี $response property เพิ่มเติม สิ่งเหล่านี้มีประโยชน์อย่างยิ่งสำหรับการดำเนินการหลังจากเหตุการณ์ ตัวอย่างเช่น คุณอาจต้องการส่งอีเมลหลังจากได้รับการตอบกลับสำเร็จ

หากต้องการสร้างเหตุการณ์และผู้ฟัง ให้ไปที่ไฟล์ app/Providers/EventServiceProvider.php และแทนที่อาร์เรย์การฟังด้วยโค้ดต่อไปนี้

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

จากนั้นรันคำสั่งต่อไปนี้ในเทอร์มินัลของคุณ:

 php artisan event:generate

คำสั่งดังกล่าวจะสร้าง app/Listeners/LogResponseReceived.php listener แทนที่โค้ดของไฟล์นั้นด้วยโค้ดด้านล่าง:

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

บันทึกข้อมูลของรหัสสถานะจะถูกพิมพ์ในเทอร์มินัล

บันทึกเทอร์มินัลแสดงรหัสสถานะ
บันทึกเทอร์มินัลแสดงรหัสสถานะ

รวมพลังของ Laravel & Guzzle เพื่อประสบการณ์ API ที่ราบรื่น พร้อมที่จะยกระดับทักษะการพัฒนาเว็บของคุณหรือยัง เริ่มที่นี่ คลิกเพื่อทวีต

สรุป

ไม่ว่าเว็บไซต์หรือเว็บแอปพลิเคชันจะสร้างขึ้นโดยองค์กรหรือนักพัฒนาอิสระ API คือกุญแจสู่ความสำเร็จ อย่างไรก็ตาม การใช้งานอาจเป็นเรื่องยาก

เฟรมเวิร์กและไลบรารีจำนวนมากสัญญาว่าจะทำให้กระบวนการนี้ง่ายขึ้น แต่ Laravel โดดเด่นที่การเน้นที่ความเรียบง่ายและใช้งานง่าย ไคลเอนต์ในตัวรองรับการเรียก API อย่างง่าย การเรียก API พร้อมกัน API Macros วิธีการช่วยเหลือสำหรับ API ที่ใช้ JSON และอื่นๆ