如何使用 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"
}
希望对您有所帮助
我正在尝试使用 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"
}
希望对您有所帮助