Phalcon 5 - 向控制器发送 post 请求导致 post 数据为空
Phalcon 5 - Sending post request to controller results in empty post data
我正在使用 docker 设置 php 8.0.15 + phalcon 5.0.0beta2 我正在尝试使用 fetch [=] 做一个简单的 post 请求26=] 到一条路线。
/* inside router.php */
$apiGroup = new Router\Group();
$apiGroup->setPrefix('/api');
$apiGroup->addPost('/user', 'UserApi::post');
/* somewhere in my controller action */
$data = [
'email' => $this->request->getPost('email', [ Filter::FILTER_EMAIL ]),
'password' => $this->request->getPost('password', [ Filter::FILTER_STRING ]),
];
/* in my js */
fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(someData)
}).then(dostuff);
我的问题是 $this->request->getPost('email')
returns 为空,在调试时我看到 $_POST 也是空的。使用 $this->request->getRawBody()
和 $this->request->getJsonRawBody()
确实会产生结果,因为我的数据确实存在。我完全可以只使用 getJsonRawBody()
,但我想知道为什么会这样? (我在另一个项目中使用了 phalcon 3.*,它工作得很好)
谢谢。
documentation for Phalcon's Request object 解释说它主要是 PHP 的本地“超全局变量”的包装器,例如 $_POST
。特别是:
The $_POST superglobal contains an associative array that contains the variables passed to the current script via the HTTP POST method when using application/x-www-form-urlencoded
or multipart/form-data
as the HTTP Content-Type
in the request. You can retrieve the data stored in the array by calling the getPost()
method
请注意,只有在使用两种特定内容类型时才会填充此数组的重要警告 - 特别是浏览器在提交 HTML 表单时使用的两种内容类型。表单处理是构建 PHP 的原始任务,它可以处理文件上传等事情;但它本身不会对 JSON、XML 或其他输入类型执行任何操作。
(顺便说一句,该文档有一个微妙的错误:尽管它的名称,$_POST
将填充任何具有适当请求正文的 HTTP 方法,例如 PUT
,就像 $_GET
即使方法是 POST
也会被填充。)
在您的请求中,您没有使用这些内容类型,因为您发布的是 JSON 字符串,因此 PHP 不会填充 $_POST
,而 Phalcon 不会getPost()
.
有什么可读的
正如您所发现的,有一个单独的方法允许您将 JSON 正文解码为 PHP 数组:
getJsonRawBody(): Gets decoded JSON HTTP raw request body
the Phalcon 3.4 Request documentation 中根本没有提到 JSON,所以我不确定该功能是否发生了变化,您是否记错了,或者您使用了一些额外的插件或配置。
REST 教程显示了 getJsonRawBody()
在 the 5.0 version and the 3.4 version.
中的用法
我正在使用 docker 设置 php 8.0.15 + phalcon 5.0.0beta2 我正在尝试使用 fetch [=] 做一个简单的 post 请求26=] 到一条路线。
/* inside router.php */
$apiGroup = new Router\Group();
$apiGroup->setPrefix('/api');
$apiGroup->addPost('/user', 'UserApi::post');
/* somewhere in my controller action */
$data = [
'email' => $this->request->getPost('email', [ Filter::FILTER_EMAIL ]),
'password' => $this->request->getPost('password', [ Filter::FILTER_STRING ]),
];
/* in my js */
fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(someData)
}).then(dostuff);
我的问题是 $this->request->getPost('email')
returns 为空,在调试时我看到 $_POST 也是空的。使用 $this->request->getRawBody()
和 $this->request->getJsonRawBody()
确实会产生结果,因为我的数据确实存在。我完全可以只使用 getJsonRawBody()
,但我想知道为什么会这样? (我在另一个项目中使用了 phalcon 3.*,它工作得很好)
谢谢。
documentation for Phalcon's Request object 解释说它主要是 PHP 的本地“超全局变量”的包装器,例如 $_POST
。特别是:
The $_POST superglobal contains an associative array that contains the variables passed to the current script via the HTTP POST method when using
application/x-www-form-urlencoded
ormultipart/form-data
as the HTTPContent-Type
in the request. You can retrieve the data stored in the array by calling thegetPost()
method
请注意,只有在使用两种特定内容类型时才会填充此数组的重要警告 - 特别是浏览器在提交 HTML 表单时使用的两种内容类型。表单处理是构建 PHP 的原始任务,它可以处理文件上传等事情;但它本身不会对 JSON、XML 或其他输入类型执行任何操作。
(顺便说一句,该文档有一个微妙的错误:尽管它的名称,$_POST
将填充任何具有适当请求正文的 HTTP 方法,例如 PUT
,就像 $_GET
即使方法是 POST
也会被填充。)
在您的请求中,您没有使用这些内容类型,因为您发布的是 JSON 字符串,因此 PHP 不会填充 $_POST
,而 Phalcon 不会getPost()
.
正如您所发现的,有一个单独的方法允许您将 JSON 正文解码为 PHP 数组:
getJsonRawBody(): Gets decoded JSON HTTP raw request body
the Phalcon 3.4 Request documentation 中根本没有提到 JSON,所以我不确定该功能是否发生了变化,您是否记错了,或者您使用了一些额外的插件或配置。
REST 教程显示了 getJsonRawBody()
在 the 5.0 version and the 3.4 version.