Как отправить запрос другому контроллеру в Laravel с помощью Guzzle - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь отправить POST-запрос с помощью Guzzle на маршрут, определенный в моем routes/web.php от модели.Модель и контроллер определены в одном приложении Laravel.Действие контроллера, связанное с маршрутом, возвращает ответ JSON и прекрасно работает при вызове из javascript с использованием Ajax.Однако, когда я пытаюсь сделать это с помощью Guzzle, у меня появляется следующая ошибка:

GuzzleHttp \ Exception \ ClientException (419)
Client error: `POST https://dev.application.com/login` resulted in a `419 unknown status` response

При поиске решения я обнаружил, что это может быть вызвано отсутствующим токеном csrf, поэтому я добавил его вмой запрос, но я все еще получаю ту же ошибку.

Вот код модели, который использует Guzzle для отправки запроса:

$client = new Client();
$response = $client->post(APPLICATION_URL.'login', [
    'headers' => [
        'X-CSRF-Token' => csrf_token()
    ],
    'form_params' => [
        'socialNetwork' => 'L',
        'id_token' => $id
    ],
]);

APPLICATION_URL это просто базовый URL-адрес приложения,начиная с https://.

Я что-то упустил?Заранее спасибо!

1 Ответ

2 голосов
/ 26 сентября 2019

Не отправляйте запросы внутренне в вашем приложении, перенаправьте вызов, отправив вместо этого пост-запросы на маршруты

Этот метод кажется более быстрым, чем использование клиентской библиотеки HTTP, такой как Guzzle

Ваш код долженвыглядит примерно так

$request = Request::create(APPLICATION_URL . 'login', 'POST', [
        'socialNetwork' => 'L',
        'id_token' => $id
    ]);
$request->headers->set('X-CSRF-TOKEN', csrf_token());
$response = app()->handle($request);
$response = json_decode($response->getContent(), true);

Обновление

Вы должны вручную обработать ответ от внутренних маршрутов, вот пример для начала

web.php

use Illuminate\Http\Request;

Route::get('/', function () {
    $request = Request::create('/test', 'POST', ['var' => 'bar']);
    $request->headers->set('X-CSRF-TOKEN', csrf_token());
    $response = app()->handle($request);
    $responseContent = json_decode($response->getContent(), true);
    return $responseContent;
});

Route::post('test', function () {
    $upperCaseVar = strtoupper(request()->var);
    return response(['foo' => $upperCaseVar]);
});

Доступ к / маршруту по запросу GET и получение ответа от /test, как будто это POST запрос Result

{
   "foo": "BAR"
}

Надеюсь, это поможет

...