Laravel 7 - не может подделать сторонний Http-вызов с использованием промежуточного программного обеспечения

Я пытаюсь использовать промежуточное программное обеспечение в Laravel 7 для подделки вызовов Http к стороннему API. Таким образом, я могу назначить это промежуточное ПО любому маршруту, который будет выполнять вызовы этого стороннего 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 не работает в промежуточном программном обеспечении. Спасибо за ваши ответы заранее.


person Hasanta    schedule 11.05.2021    source источник


Ответы (1)


Вместо возврата $next($request) вы должны вернуть response(...) в промежуточном программном обеспечении. Возможно, просто перенаправить ответ от поддельного звонка.

return response($responseFrom3rdPartyApiCall, 200);
person Johan    schedule 11.05.2021
comment
Я не могу вернуть ответ в этом промежуточном программном обеспечении. Запрос должен пройти дальше в контроллеры для обработки, что запускает несколько других действий. Надеюсь, вы поняли. - person Hasanta; 14.05.2021
comment
Ах, извините. Думал, вы хотите прервать и проксировать поддельный ответ API от промежуточного программного обеспечения. Я действительно не вижу смысла вызывать поддельный API, а затем просто избавляться от ответа. Учитывая, что вы импортировали все классы, которые вы используете в промежуточном программном обеспечении, оно должно выполняться. Но как вы можете сказать, поскольку он ничего не регистрирует и не выводит? - person Johan; 25.05.2021