Laravel의 내장 클라이언트를 사용하여 외부 API와 상호 작용하는 방법

게시 됨: 2023-04-24

Laravel은 새로운 웹 개발자와 숙련된 웹 개발자 모두에게 API 상호 작용을 쉽게 만듭니다. Larvel HTTP 클라이언트는 PHP의 Guzzle HTTP 클라이언트 위에 구축되어 개발자가 HTTP 요청을 할 때 보다 원활한 경험을 제공합니다. 주요 기능에는 인증, 라우팅 및 효과적인 ORM(개체 관계형 매핑)이 포함됩니다.

이 기사에서는 Laravel의 HTTP 클라이언트를 사용하여 요청, 디버그 응답, 미들웨어 및 매크로 생성 등을 살펴봅니다.

Laravel HTTP 클라이언트는 API를 위해 힘든 작업을 수행합니다.

Guzzle은 PHP용 간단한 HTTP 클라이언트입니다. 스트리밍 기능 및 멀티파트 요청과 함께 GET , POST , PUTDELETE 포함하여 다양한 양식 요청에 대한 기능을 제공합니다. Guzzle HTTP 클라이언트를 사용하면 동기식 및 비동기식 요청을 서버로 보낼 수 있습니다. 또한 클라이언트의 동작을 사용자 정의할 수 있는 적절한 미들웨어도 함께 제공됩니다.

Laravel의 HTTP 클라이언트는 Guzzle에 구축된 래퍼이지만 추가 기능이 있습니다. 여기에는 실패한 요청 재시도에 대한 지원과 JSON 데이터가 포함된 일부 도우미 기능이 포함됩니다. Laravel HTTP 클라이언트의 대부분의 기능은 Guzzle과 유사합니다.

API 상호 작용을 위해 Laravel의 내장 클라이언트를 최대한 활용하십시오! API가 처음이신가요? 이 가이드에서 다루었습니다. 트윗하려면 클릭하세요.

전제 조건

다음 섹션에서는 Laravel의 HTTP 클라이언트에 대해 자세히 알아봅니다. 따라 하려면 다음이 필요합니다.

  • Laravel, PHP 및 API에 대한 기본 지식
  • PHP 및 Composer 설치
  • 우편 집배원

요청하는 방법

HTTP 클라이언트를 사용하여 요청하는 방법을 이해하려면 ReqRes와 같은 많은 호스팅 API를 활용할 수 있습니다.

응용 프로그램을 만들 때 포함된 HTTP 패키지를 가져오는 것으로 시작합니다. App/Http/Controllers/UserController.php 파일 내에서 다음 코드를 추가합니다. 파일 시작 부분의 use 문과 index 함수 내부의 나머지 코드로 시작합니다.

 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을 사용하여 이 경로를 테스트할 수 있습니다. Postman을 열고 http://127.0.0.1:8000/post를 URL로 추가하고 요청 유형을 GET 으로 지정합니다. 보내기 를 클릭하면 다음 응답이 표시됩니다.

Postman을 사용하여 요청하기
Postman을 사용하여 요청하기

동시 요청

병렬 요청은 동일한 기간에 더 많은 데이터를 가져올 수 있으므로 성능을 크게 향상시킵니다. Laravel의 HTTP 클라이언트는 pool 메소드를 사용하여 동시 요청을 수행할 수 있도록 합니다.

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

참고: 파일 시작 부분에 use 문을 추가해야 합니다.

그런 다음 다음 코드를 추가하여 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 애플리케이션을 부트스트랩하면 예제 테스트가 이미 생성되어 있습니다. tests/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

테스트가 완료되면 두 가지 테스트를 실행했으며 둘 다 성공했음을 알 수 있습니다.

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 리스너를 생성합니다. 해당 파일의 코드를 아래 코드로 바꿉니다.

 <?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과 Guzzle의 기능을 결합하십시오. 웹 개발 기술 수준을 높일 준비가 되셨습니까? 여기에서 시작하세요. 트윗하려면 클릭하세요.

요약

웹 사이트나 웹 애플리케이션을 조직에서 만들든 독립 개발자가 만들든 관계없이 API는 성공의 핵심입니다. 그러나 그것들을 사용하는 것은 어려울 수 있습니다.

많은 프레임워크와 라이브러리가 이 프로세스를 단순화할 것을 약속하지만 Laravel은 단순성과 사용 편의성에 중점을 두고 있습니다. 내장 클라이언트는 손쉬운 API 호출, 동시 API 호출, API 매크로, JSON 기반 API용 도우미 메서드 등을 지원합니다.