如何使用 Guzzle 向 Laravel 中的另一个控制器发送请求

How to send a request to another controller in Laravel using Guzzle

我正在尝试使用 Guzzle 从模型向我的 routes/web.php 中定义的路由发送 POST 请求。模型和控制器都在同一个 Laravel 应用程序中定义。控制器操作链接到路由 returns 一个 JSON 响应,并且在使用 Ajax 从 javascript 调用时工作正常。但是,当我尝试使用 Guzzle 执行此操作时,出现以下错误:

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

在搜索解决方案时,我了解到这可能是由于缺少 csrf 令牌引起的,因此我将其添加到我的 reuqest 中,但仍然出现相同的错误。

下面是使用 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://.

开头

我错过了什么吗?提前致谢!

不要在您的应用程序内部发送请求,而是通过向路由发送 post 请求来转发呼叫

这种方法似乎比使用像 Guzzle 这样的 HTTP 客户端库更快

您的代码应如下所示

$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"
}

希望对您有所帮助