首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Laravel 7-无法使用中间件伪造第三方Http呼叫

Laravel 7-无法使用中间件伪造第三方Http呼叫
EN

Stack Overflow用户
提问于 2021-05-11 19:04:33
回答 1查看 32关注 0票数 0

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

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

中间件如下所示。

代码语言:javascript
运行
复制
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,它确实可以工作。

将中间件附加到路由,如下所示。(中间件在app/Http/Kernal.php$routeMiddleware数组中正确注册)

代码语言:javascript
运行
复制
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不能在中间件中工作。提前感谢您的回答。

EN

回答 1

Stack Overflow用户

发布于 2021-05-11 19:59:45

您应该返回一个响应(...),而不是返回$next($request)在你的中间件中。也许只是转发来自假呼叫的响应。

代码语言:javascript
运行
复制
return response($responseFrom3rdPartyApiCall, 200);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67485489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档