วิธีใช้ไคลเอนต์ในตัวของ Laravel เพื่อโต้ตอบกับ API ภายนอก
เผยแพร่แล้ว: 2023-04-24Laravel ทำให้การโต้ตอบกับ 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
ข้อกำหนดเบื้องต้น
ในส่วนต่อไปนี้ คุณจะได้เรียนรู้เพิ่มเติมเกี่ยวกับไคลเอนต์ 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 ครั้ง ซึ่งทั้งสองการทดสอบประสบความสำเร็จ
ในทำนองเดียวกัน คุณสามารถตรวจสอบคำขอประเภทต่างๆ และใช้วิธีการช่วยเหลืออื่นๆ สำหรับการทดสอบที่ซับซ้อนยิ่งขึ้น
วิธีจัดการกับเหตุการณ์
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) { } }
บันทึกข้อมูลของรหัสสถานะจะถูกพิมพ์ในเทอร์มินัล
สรุป
ไม่ว่าเว็บไซต์หรือเว็บแอปพลิเคชันจะสร้างขึ้นโดยองค์กรหรือนักพัฒนาอิสระ API คือกุญแจสู่ความสำเร็จ อย่างไรก็ตาม การใช้งานอาจเป็นเรื่องยาก
เฟรมเวิร์กและไลบรารีจำนวนมากสัญญาว่าจะทำให้กระบวนการนี้ง่ายขึ้น แต่ Laravel โดดเด่นที่การเน้นที่ความเรียบง่ายและใช้งานง่าย ไคลเอนต์ในตัวรองรับการเรียก API อย่างง่าย การเรียก API พร้อมกัน API Macros วิธีการช่วยเหลือสำหรับ API ที่ใช้ JSON และอื่นๆ