加入收藏 | 设为首页 | 会员中心 | 我要投稿 天瑞地安资讯网 (https://www.52baoding.com/)- 网络、物联网络、物联安全、云安全、行业智能!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

Laravel HTTP Client窍门有哪些

发布时间:2023-06-24 12:01:28 所属栏目:PHP教程 来源:互联网
导读:   为大家详细介绍“Laravel HTTP Client技巧有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Laravel HTTP Client技巧有哪些”文章能帮助大家解决疑惑,下面
  为大家详细介绍“Laravel HTTP Client技巧有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Laravel HTTP Client技巧有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
 
  作为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);
 
  });
 
  或者,如果你想将宏与服务相结合,可以在你的 AppServiceProvider 的 boot() 方法中使用你定义的宏:
 
  $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 类中。
 
  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();
 
      }
 
  }
 
  这样做将确保你的测试套件中触发的每个 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('HTTP请求正在发送。', ['url' => $event->request->url()
 
              'url' => $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"}
 

(编辑:天瑞地安资讯网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!