微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Laravel 7 - 不能使用中间件伪造 3rd 方 Http 调用

如何解决Laravel 7 - 不能使用中间件伪造 3rd 方 Http 调用

我正在尝试使用 Laravel 7 中的中间件来伪造对 3rd 方 API 的 Http 调用。因此,我可以将该中间件分配给将调用该 3rd 方 API 的任何路由。因此,无论何时调用该路由,它都会调用伪造的 API。

这样做的目的是,当我想伪造 API 时,我只需要将中间件分配给路由。当我不想伪造 API 时,我会从路由中删除中间件。

中间件如下所示。

namespace App\Http\Middleware;

class MockApiEndpoints
{
    public function handle($request,Closure $next)
    {
        // mock api/endpoint
        $vacancies = $this->vacancyRepository->all();
        $url = 'api/endpoint';
        $sessionId = Str::uuid()->toString();
        $response = [
            'result' => 'OK','content' => [
                'suggestedVacancies' => array_map(function ($uid) {
                    return [
                        'id' => $uid,'relevance' => bcdiv(rand(9,99),100,2)
                    ];
                },$vacancies->pluck('uid')->all()),'sessionId' => $sessionId
            ]
        ];
        $this->mockHttpRequest($url,$response);

        return $next($request);
    }

    protected function mockHttpRequest(string $uri,$response,int $status = 200,array $headers = [])
    {
        $url = config('api.base_url') . '/' . $uri;

        Http::fake([
            $url => Http::response($response,$status,$headers)
        ]);
    }
}

即使我将此中间件附加到路由,路由仍会调用原始 API。所以 Htpp::fake 似乎在中间件中不起作用。 Htpp::fake 如果我在控制器中使用它确实有效。

中间件附加到路由如下。 (中间件在 $routeMiddleware 中的 app/Http/Kernal.PHP 数组中正确注册

namespace App\Providers;

class RouteServiceProvider extends ServiceProvider
{
    protected function mapApiRoutes()
    {
        Route::prefix('api')
            ->middleware(['MockApiEndpoints'])
            ->namespace($this->namespace . '\Api')
            ->group(base_path('routes/api.PHP'));
    }
}

我通过一种变通方法完成了我的工作。但我想知道为什么 Http::fake 在中间件中不起作用。提前感谢您的回答。

解决方法

您应该在中间件中返回一个 response(...) 而不是返回 $next($request)。 也许只是转发假电话的回复。

req.isAuthenticated()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。