我正在尝试使用Laravel 7中的中间件来伪造对第三方API的Http调用。因此,我可以将该中间件分配给任何调用第三方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,它确实可以工作。
将中间件附加到路由,如下所示。(中间件在app/Http/Kernal.php的$routeMiddleware数组中正确注册)
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不能在中间件中工作。提前感谢您的回答。
发布于 2021-05-11 19:59:45
您应该返回一个响应(...),而不是返回$next($request)在你的中间件中。也许只是转发来自假呼叫的响应。
return response($responseFrom3rdPartyApiCall, 200);https://stackoverflow.com/questions/67485489
复制相似问题