목차
HTTP 宏
可移植的基础 URL 配置
防止测试中的杂散请求
了解更多
PHP 프레임워크 Laravel Laravel HTTP 클라이언트 팁 5가지 분석 및 요약

Laravel HTTP 클라이언트 팁 5가지 분석 및 요약

Mar 23, 2023 pm 04:38 PM
laravel

이 기사에서는 Laravel HTTP 클라이언트에 대한 5가지 팁을 주로 공유합니다. 관심 있는 분들은 아래 내용을 살펴보시면 도움이 될 것입니다.

개발자로서 우리는 Laravel 애플리케이션에서 api와 상호작용해야 하는 경우가 많습니다. Guzzle HTTP 라이브러리에 대한 편리하고 직관적인 래퍼는 Laravel HTTP 클라이언트 버전 7에서 제공됩니다. 이 글에서는 개발 경험을 더욱 효율적이고 즐겁게 만들 수 있는 Laravel HTTP 클라이언트 사용에 대한 다섯 가지 유용한 팁을 살펴보겠습니다. web开发人员,我们经常需要与来自Laravel应用程序的api进行交互。在Laravel HTTP客户端版本7中提供了一个方便而直观的Guzzle HTTP库包装器。在本文中,我们将探讨使用Laravel HTTP Client的五个有价值的技巧,这些技巧可以使你的开发体验更加高效和愉快。

这些技巧包括使用HTTP宏、为容器服务配置HTTP客户机、可移植的基本URL配置、防止测试中的杂发请求以及侦听HTTP事件。通过掌握这些技巧,你可以简化API交互并创建更健壮和可维护的Laravel应用程序。

HTTP 宏

Laravel 的许多服务都有一个特性,允许你为应用程序定义自定义方法。你可以将这些宏添加到服务提供者的boot()方法中,而不是从 Laravel 框架扩展核心类。

HTTP 文档中展示了一个宏的示例,你可以使用它来定义常见的设置:

public function boot(): void
{
    Http::macro('github', function () {
        return Http::withHeaders([
            'X-Example' => 'example',
        ])->baseUrl('https://github.com');
    });
}

// Usage
response = Http::github()->get('/');
로그인 후 복사

宏可以定义任何你想在应用程序中定义和重复使用的便捷方法。文档中的宏示例涉及到了另一个配置 HTTP 客户端用于在其他服务中使用的提示。

在下一节中,我们将重温将宏与传递客户端到其他容器服务相结合的方法。

配置容器服务的 HTTP 客户端

在 Laravel 应用程序中与 API 交互时,你可能希望为客户端配置各种可配置的设置。例如,如果 API 具有多个环境,则需要配置基本 URL、令牌、超时设置等。

我们可以利用宏来定义客户端,将客户端表示为自己的服务,然后将其注入到其他服务中,或者两者都有。

首先,让我们看看如何在服务提供者的 register() 方法中定义客户端设置:

public function register(): void
{
    $this->app->singleton(ExampleService::class, function (Application $app) {
        $client = Http::withOptions([
            'base_uri' => config('services.example.base_url'),
            'timeout' => config('services.example.timeout', 10),
            'connect_timeout' => config('services.example.connect_timeout', 2),
        ])->withToken(config('services.example.token'));

        return new ExampleService($client);
    });
}
로그인 후 복사

在单例服务定义中,我们链式调用了一些调用以配置客户端。结果是一个 PendingRequest 实例,我们可以将其传递给我们的服务构造函数,如下所示:

class ExampleService
{
    public function __construct(
        private PendingRequest $client
    ) {}

    public function getWidget(string $uid)
    {
        $response = $this->client
            ->withUrlParameters(['uid' => $uid])
            ->get('widget/{uid}');

        return new Widget($response->json());
    }
}
로그인 후 복사

该服务使用 withOptions() 方法直接配置 Guzzle 选项,但我们也可以使用 HTTP 客户端提供的一些便捷方法:

$this->app->singleton(ExampleService::class, function (Application $app) {
    $client = Http::baseUrl(config('services.example.base_url'))
        ->timeout(config('services.example.timeout', 10))
        ->connectTimeout(config('services.example.connect_timeout', 2))
        ->withToken(config('services.example.token'));

    return new ExampleService($client);
});
로그인 후 복사

或者,如果你想将宏与服务相结合,可以在你的 AppServiceProviderboot() 方法中使用你定义的宏:

$this->app->singleton(ExampleService::class, function (Application $app) {
    return new ExampleService(Http::github());
});
로그인 후 복사

可移植的基础 URL 配置

你可能已经看到默认的基础 URL 包含一个尾随的 /,根据 RFC3986,这提供了最大的可移植性。

以下面的服务配置为例 (注意默认的 base_url):

return [
    'example' => [
        'base_url' => env('EXAMPLE_BASE_URI', 'https://api.example.com/v1/'),
        'token' => env('EXAMPLE_SERVICE_TOKEN'),
        'timeout' => env('EXAMPLE_SERVICE_TIMEOUT', 10),
        'connect_timeout' => env('EXAMPLE_SERVICE_TIMEOUT', 2),
    ],
];
로그인 후 복사

如果我们的 API 在生产和测试环境中有一个路径前缀 /v1/ ,也许它只是 https://stg-api.example.com/; 使用尾部斜线可以使 URL 按预期工作,而不会更改代码。在配置尾部 / 的同时,请注意,我的代码中的所有 API 调用都使用相对路径:

$this->client
    ->withUrlParameters(['uid' => $uid])
    // 例子:
    // 测试环境 - https://stg-api.example.com/widget/123
    // 生产环境 - https://api.example.com/v1/widget/123
    ->get('widget/{uid}');
로그인 후 복사

请参阅 Guzzle 的创建客户端文档,了解不同的 base_uri 风格是如何影响 URI 的解析的。

防止测试中的杂散请求

Laravel 的 HTTP 客户端提供了优秀的测试工具,使编写测试变得轻而易举。当我写与 API 交互的代码时,我感到不安的是我的测试在某种程度上有实际的网络请求发生。进入防止杂散请求与 Laravel 的 HTTP 客户端:

Http::preventStrayRequests();

Http::fake([
    'github.com/*' => Http::response('ok'),
]);

// Run test code
// If any other code triggers an HTTP call via Laravel's client
// an exception is thrown.
로그인 후 복사

在我看来,使用 preventStrayRequests() 的最好方法是在你期望与 API 交互的测试类中定义一个 setUp() 方法。也许你也可以把它添加到你的应用程序的基础 TestCase

이 팁에는 HTTP 매크로 사용, 컨테이너 서비스용 HTTP 클라이언트 구성, 이식 가능한 기본 URL 구성, 테스트 시 혼란 방지가 포함됩니다. HTTP 이벤트를 수신합니다. 이러한 기술을 익히면 API 상호 작용을 단순화하고 더욱 강력하고 유지 관리가 쉬운 Laravel 애플리케이션을 만들 수 있습니다.

HTTP 매크로

많은 Laravel 서비스에는 애플리케이션에 대한 사용자 정의 방법을 정의할 수 있는 매크로 기능이 있습니다. Laravel 프레임워크에서 핵심 클래스를 확장하는 대신 서비스 제공자의 boot() 메서드에 이러한 매크로를 추가할 수 있습니다.

HTTP 문서에는 일반 설정을 정의하는 데 사용할 수 있는 매크로의 가 나와 있습니다. 🎜
namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
use Illuminate\Support\Facades\Http;

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication;

    public function setUp(): void
    {
        parent::setUp();

        Http::preventStrayRequests();
    }
}
로그인 후 복사
🎜Macros 애플리케이션에서 정의하고 재사용하려는 편의 메소드를 정의하십시오. 설명서의 매크로 예제에는 다른 서비스와 함께 사용할 수 있도록 HTTP 클라이언트를 구성하는 또 다른 팁이 포함되어 있습니다. 🎜🎜다음 섹션에서는 매크로를 결합하여 클라이언트를 다른 컨테이너 서비스로 전달하는 방법을 다시 살펴보겠습니다. 🎜🎜 컨테이너 서비스의 HTTP 클라이언트 구성 🎜🎜Laravel 애플리케이션에서 API와 상호작용할 때 구성 가능한 다양한 옵션을 구성할 수 있습니다. 클라이언트 설정. 예를 들어 API에 여러 환경이 있는 경우 기본 URL, 토큰, 시간 초과 설정 등을 구성해야 합니다. 🎜🎜매크로를 활용하여 클라이언트를 정의하고 클라이언트를 자체 서비스로 표현한 다음 이를 다른 서비스에 삽입하거나 둘 다를 수행할 수 있습니다. 🎜🎜먼저 서비스 공급자의 register() 메서드에서 클라이언트 설정을 정의하는 방법을 살펴보겠습니다. 🎜
namespoace App/Listeners;

use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Log;

class LogRequestSending
{
    public function handle(object $event): void
    {
        Log::debug('HTTP请求正在发送。', ['url' => $event->request->url()
            'url' => $event->request->url(),
        ]);
    }
}
로그인 후 복사
로그인 후 복사
🎜싱글턴 서비스 정의에서 클라이언트 구성을 위한 몇 가지 호출을 연결했습니다. 결과는 PendingRequest 인스턴스이며, 다음과 같이 서비스 생성자에 전달할 수 있습니다. 🎜
use App\Listeners\LogRequestSending;
use Illuminate\Http\Client\Events\RequestSending;
// ...
protected $listen = [
    Registered::class => [
        SendEmailVerificationNotification::class,
    ],
    RequestSending::class => [
        LogRequestSending::class,
    ],
];
로그인 후 복사
로그인 후 복사
🎜서비스는 withOptions() 메서드를 사용하여 Guzzle 옵션을 직접 구성하지만 HTTP 클라이언트에서 제공하는 몇 가지 편리한 방법을 사용할 수도 있습니다. 🎜
[2023-03-17 04:06:03] local.DEBUG: HTTP请求正在被发送。{"url": "https://api.example.com/v1/widget/123"}
로그인 후 복사
로그인 후 복사
🎜 또는 매크로를 서비스와 결합하려는 경우 AppServiceProviderboot()<에서 수행할 수 있습니다. 정의된 매크로를 사용하는 /code> 메소드: 🎜rrreee🎜이식 가능한 기본 URL 구성🎜🎜<a href=" https://에 따라 기본 기본 URL에 후행 <code>/가 포함되어 있음을 확인하실 수 있습니다. www.php.cn/link/e1390927a3211895fec6f0bc8f5c9f7d" rel="nofollow noopener noreferrer">RFC3986은 최대의 이식성을 제공합니다. 🎜🎜다음 서비스 구성을 예로 들어 보겠습니다(기본 base_url 참고). 🎜rrreee🎜우리 API에 프로덕션 및 테스트 환경에서 경로 접두어 /v1/가 있는 경우 아마도 일 수 있습니다. https://stg-api.example.com/; 후행 슬래시를 사용하면 코드를 변경하지 않고도 URL이 예상대로 작동합니다. 후행 /를 구성하는 동안 내 코드의 모든 API 호출은 상대 경로를 사용합니다. 🎜rrreee🎜Guzzle의 클라이언트 문서를 작성하여 다양한 base_uri 스타일이 URI 구문 분석에 미치는 영향을 이해하세요. 🎜🎜테스트에서 잘못된 요청 방지🎜🎜Laravel의 HTTP 클라이언트는 테스트 작성을 쉽게 만들어주는 뛰어난 테스트 도구를 제공합니다. API와 상호 작용하는 코드를 작성할 때 어떤 면에서 테스트에 실제 네트워크 요청이 발생한다는 사실이 불안합니다. Laravel의 HTTP 클라이언트를 사용하여 Prevent Stray Requests를 입력하세요. 🎜rrreee🎜 제 생각에는 preventStryRequests( )</code를 사용하세요. >는 API와 상호작용할 것으로 예상되는 테스트 클래스에 <code>setUp() 메서드를 정의하는 것입니다. 어쩌면 이를 애플리케이션의 기본 TestCase 클래스에 추가할 수도 있습니다. 🎜rrreee🎜이렇게 하면 테스트 모음에서 실행된 모든 HTTP 클라이언트 호출이 가짜 요청으로 뒷받침됩니다. 이 접근 방식을 사용하면 테스트에서 동등한 가짜 요청으로 모든 아웃바운드 요청을 처리했다는 확신을 갖게 되었습니다. 🎜🎜HTTP 이벤트용 로그 핸들러🎜🎜Laravel의 HTTP 클라이언트에는 요청/응답 수명 주기의 중요한 단계를 빠르게 파헤치는 데 사용할 수 있는 귀중한 이벤트가 많이 있습니다. 이 글을 쓰는 시점에 세 가지 이벤트가 발생했습니다: 🎜
  • Illuminate\HttpClient\Events\RequestSending
  • IlluminateHttpClient\Events\ResponseReceived
  • IlluminateHttpClient\EventsConnectionFailed

比方说,你想把你的应用程序发出请求的每个 URL 都可视化。我们可以很容易地接入 RequestSending 事件,并记录出每个请求。

namespoace App/Listeners;

use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Log;

class LogRequestSending
{
    public function handle(object $event): void
    {
        Log::debug(&#39;HTTP请求正在发送。&#39;, [&#39;url&#39; => $event->request->url()
            &#39;url&#39; => $event->request->url(),
        ]);
    }
}
로그인 후 복사
로그인 후 복사

为了使事件处理程序工作,在 EventServiceProvider 类中添加以下内容。

use App\Listeners\LogRequestSending;
use Illuminate\Http\Client\Events\RequestSending;
// ...
protected $listen = [
    Registered::class => [
        SendEmailVerificationNotification::class,
    ],
    RequestSending::class => [
        LogRequestSending::class,
    ],
];
로그인 후 복사
로그인 후 복사

一旦它被连接起来,你就会在你的日志中看到类似于 HTTP 客户端尝试的每个请求的内容。

[2023-03-17 04:06:03] local.DEBUG: HTTP请求正在被发送。{"url": "https://api.example.com/v1/widget/123"}
로그인 후 복사
로그인 후 복사

了解更多

官方的Laravel HTTP 文档有你需要的一切,可以开始了。我希望这个教程能给你一些灵感和技巧,你可以在你的 Laravel 应用程序中使用。

原文地址:https://laravel-news.com/laravel-http-cl...

译文地址:https://www.php.cn/link/bac346f4c260a59fde0b1546e8a025aa

위 내용은 Laravel HTTP 클라이언트 팁 5가지 분석 및 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP에서 ORM(객체 관계형 매핑)을 사용하여 데이터베이스 작업을 단순화하는 방법은 무엇입니까? PHP에서 ORM(객체 관계형 매핑)을 사용하여 데이터베이스 작업을 단순화하는 방법은 무엇입니까? May 07, 2024 am 08:39 AM

PHP의 데이터베이스 작업은 객체를 관계형 데이터베이스에 매핑하는 ORM을 사용하여 단순화됩니다. Laravel의 EloquentORM을 사용하면 객체 지향 구문을 사용하여 데이터베이스와 상호 작용할 수 있습니다. 모델 클래스를 정의하거나 Eloquent 메소드를 사용하거나 실제로 블로그 시스템을 구축하여 ORM을 사용할 수 있습니다.

Laravel과 CodeIgniter의 최신 버전 비교 Laravel과 CodeIgniter의 최신 버전 비교 Jun 05, 2024 pm 05:29 PM

Laravel 9 및 CodeIgniter 4의 최신 버전은 업데이트된 기능과 개선 사항을 제공합니다. Laravel9은 MVC 아키텍처를 채택하여 데이터베이스 마이그레이션, 인증, 템플릿 엔진 등의 기능을 제공합니다. CodeIgniter4는 HMVC 아키텍처를 사용하여 라우팅, ORM 및 캐싱을 제공합니다. 성능면에서는 Laravel9의 서비스 제공자 기반 디자인 패턴과 CodeIgniter4의 경량 프레임워크가 뛰어난 성능을 제공합니다. 실제 애플리케이션에서 Laravel9은 유연성과 강력한 기능이 필요한 복잡한 프로젝트에 적합한 반면, CodeIgniter4는 빠른 개발 및 소규모 애플리케이션에 적합합니다.

Laravel과 CodeIgniter의 데이터 처리 기능은 어떻게 비교됩니까? Laravel과 CodeIgniter의 데이터 처리 기능은 어떻게 비교됩니까? Jun 01, 2024 pm 01:34 PM

Laravel과 CodeIgniter의 데이터 처리 기능을 비교해 보세요. ORM: Laravel은 클래스-객체 관계형 매핑을 제공하는 EloquentORM을 사용하는 반면, CodeIgniter는 데이터베이스 모델을 PHP 클래스의 하위 클래스로 표현하기 위해 ActiveRecord를 사용합니다. 쿼리 빌더: Laravel에는 유연한 체인 쿼리 API가 있는 반면, CodeIgniter의 쿼리 빌더는 더 간단하고 배열 기반입니다. 데이터 검증: Laravel은 사용자 정의 검증 규칙을 지원하는 Validator 클래스를 제공하는 반면, CodeIgniter는 내장된 검증 기능이 적고 사용자 정의 규칙을 수동으로 코딩해야 합니다. 실제 사례: 사용자 등록 예시에서는 Lar를 보여줍니다.

Laravel - 장인 명령 Laravel - 장인 명령 Aug 27, 2024 am 10:51 AM

Laravel - Artisan Commands - Laravel 5.7은 새로운 명령을 처리하고 테스트하는 새로운 방법을 제공합니다. 여기에는 장인 명령을 테스트하는 새로운 기능이 포함되어 있으며 데모는 아래에 언급되어 있습니다.

Laravel과 CodeIgniter 중 어느 것이 더 초보자에게 적합합니까? Laravel과 CodeIgniter 중 어느 것이 더 초보자에게 적합합니까? Jun 05, 2024 pm 07:50 PM

초보자의 경우 CodeIgniter는 학습 곡선이 더 완만하고 기능이 적지만 기본적인 요구 사항을 충족합니다. Laravel은 더 넓은 기능 세트를 제공하지만 학습 곡선이 약간 더 가파릅니다. 성능면에서는 Laravel과 CodeIgniter 모두 좋은 성능을 보입니다. Laravel은 보다 광범위한 문서와 적극적인 커뮤니티 지원을 제공하는 반면 CodeIgniter는 더 간단하고 가벼우며 강력한 보안 기능을 갖추고 있습니다. 블로그 애플리케이션을 구축하는 실제 사례에서 Laravel의 EloquentORM은 데이터 조작을 단순화하는 반면 CodeIgniter는 더 많은 수동 구성이 필요합니다.

Laravel과 CodeIgniter: 대규모 프로젝트에는 어떤 프레임워크가 더 좋나요? Laravel과 CodeIgniter: 대규모 프로젝트에는 어떤 프레임워크가 더 좋나요? Jun 04, 2024 am 09:09 AM

대규모 프로젝트를 위한 프레임워크를 선택할 때 Laravel과 CodeIgniter는 각각 고유한 장점을 가지고 있습니다. Laravel은 엔터프라이즈급 애플리케이션을 위해 설계되었으며 모듈식 디자인, 종속성 주입 및 강력한 기능 세트를 제공합니다. CodeIgniter는 속도와 사용 편의성을 강조하여 중소 규모 프로젝트에 더 적합한 경량 프레임워크입니다. 요구 사항이 복잡하고 사용자 수가 많은 대규모 프로젝트의 경우 Laravel의 성능과 확장성이 더 적합합니다. 간단한 프로젝트나 리소스가 제한된 상황에서는 CodeIgniter의 가볍고 빠른 개발 기능이 더 이상적입니다.

PHP 엔터프라이즈 애플리케이션 마이크로서비스 아키텍처 설계에 대한 질문과 답변 PHP 엔터프라이즈 애플리케이션 마이크로서비스 아키텍처 설계에 대한 질문과 답변 May 07, 2024 am 09:36 AM

마이크로서비스 아키텍처는 PHP 프레임워크(예: Symfony 및 Laravel)를 사용하여 마이크로서비스를 구현하고 RESTful 원칙 및 표준 데이터 형식에 따라 API를 설계합니다. 마이크로서비스는 메시지 대기열, HTTP 요청 또는 gRPC를 통해 통신하고 모니터링 및 문제 해결을 위해 Prometheus 및 ELKStack과 같은 도구를 사용합니다.

Laravel과 CodeIgniter: 소규모 프로젝트에는 어떤 프레임워크가 더 좋나요? Laravel과 CodeIgniter: 소규모 프로젝트에는 어떤 프레임워크가 더 좋나요? Jun 04, 2024 pm 05:29 PM

소규모 프로젝트의 경우 Laravel은 강력한 기능과 보안이 필요한 대규모 프로젝트에 적합합니다. CodeIgniter는 가볍고 사용하기 쉬운 매우 작은 프로젝트에 적합합니다.

See all articles