【问题标题】:Laravel Http client before request send add headers请求发送前的 Laravel Http 客户端添加标头
【发布时间】:2022-05-05 16:56:51
【问题描述】:

我正在使用 Http 客户端发出传出的 HTTP 请求。我在项目中的很多地方都使用过它。现在项目有新的要求,我必须为每个传出添加一个新的标题 要求。我可以通过将它添加到每个地方来做到这一点。但我想知道,是否有任何类型的触发器或事件可以让我在请求发送之前修改标头。有一个事件 Illuminate\Http\Client\Events\RequestSending 仅对检查请求有用。

【问题讨论】:

  • 如果你使用 guzzle 客户端实例,你可以添加一个处理程序堆栈并为 guzzle 制作一个函数中间件让我们说 add_header() 可以通过处理程序调用它,你可以通过 withOptions 调用它它只是一个httpclient的想法还没有尝试过
  • 谢谢@bhucho,这实际上就是我想要的。我的标头 fp-signature 取决于请求正文和 params ,通过添加处理程序,我可以在处理程序中获取这些东西并可以创建 fp-signature。此解决方案有效。谢谢
  • 我明天会尝试并在这里发布答案,这是一个很好的问题,将来会有所帮助。

标签: laravel laravel-8 guzzle laravel-http-client


【解决方案1】:

这可以在不需要包的情况下实现。您可以在服务提供者中简单地执行以下操作:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Http\Client\Factory as Http;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->extend(Http::class, function ($service, $app) {
            return $service->withOptions(['foo' => 'bar']);
        });
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

【讨论】:

    【解决方案2】:

    是的,这可以通过一个很棒的包here 来实现。安装软件包后,您只需设置默认标头,例如,

    Http::withDefaultOptions([
         'headers' => [
             'X-Bar-Header' => 'bar'
         ],
    ]);
    

    但我很不幸,我的 laravel 9-dev 没有安装这个包。所以我不得不为我提取代码。首先,在你的 app\HttpClient 目录下创建一个 Factory 类,

    <?php
    
    namespace App\HttpClient;
    
    use Illuminate\Http\Client\Factory as BaseFactory;
    use Illuminate\Http\Client\PendingRequest;
    use Illuminate\Support\Arr;
    
    class Factory extends BaseFactory
    {
        protected $ignoreDefaultOptions = false;
    
        protected $defaultOptions = [];
    
        public function ignoreDefaultOptions()
        {
            $this->ignoreDefaultOptions = true;
    
            return $this;
        }
    
        public function withoutDefaultOptions($keys = null)
        {
            if ($keys === null) {
                return $this->ignoreDefaultOptions();
            }
    
            if (func_num_args() > 1) {
                $keys = func_get_args();
            }
    
            $this->defaultOptions = with($this->defaultOptions, function ($options) use ($keys) {
                foreach (Arr::wrap($keys) as $key) {
                    Arr::forget($options, $key);
                }
    
                return $options;
            });
    
            return $this;
        }
    
        public function withDefaultOptions(array $options)
        {
            $this->defaultOptions = array_merge_recursive($this->defaultOptions, $options);
    
            return $this;
        }
    
        public function __call($method, $parameters)
        {
            if (static::hasMacro($method)) {
                return $this->macroCall($method, $parameters);
            }
    
            if ($this->defaultOptions && ! $this->ignoreDefaultOptions) {
                return tap(new PendingRequest($this), function ($request) {
                    $request->withOptions($this->defaultOptions)
                        ->stub($this->stubCallbacks);
                })->{$method}(...$parameters);
            }
    
            return parent::__call($method, $parameters);
        }
    }
    

    然后,创建一个HttpServiceProver,

    php artisan make:provider HttpServiceProvider
    

    然后把下面的代码放在那里,

    <?php
    
    namespace App\Providers;
    
    use Illuminate\Support\ServiceProvider;
    use Illuminate\Contracts\Events\Dispatcher;
    use Illuminate\Http\Client\Factory as BaseFactory;
    use App\HttpClient\Factory;
    
    class HttpServiceProvider extends ServiceProvider
    {
        /**
         * Register services.
         *
         * @return void
         */
        public function register()
        {
            $this->app->bind(
                BaseFactory::class,
                function ($app) {
                    return new Factory($app->make(Dispatcher::class));
                }
            );
        }
    
        /**
         * Bootstrap services.
         *
         * @return void
         */
        public function boot()
        {
            //
        }
    }
    

    现在,在 AppServiceProvider.php 中注册新创建的服务提供者

    public function register()
    {
        //...
        app()->register(HttpServiceProvider::class);
    }
    
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //....
        Http::withDefaultOptions([
            'headers' => [
                'X-Bar-Header' => 'bar'
            ],
        ]);
    }
    

    此软件包中还有其他选项。详情请查看the package link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      • 2020-08-16
      • 2015-05-17
      相关资源
      最近更新 更多