方案1发送x-www-form-urlencoded
数据
POST /path HTTP/1.1
Content-Type: application/x-www-form-urlencoded
foo=bar
正在运行print_r($request->getParsedBody());
返回正常:
Array
(
[foo] => bar
)
正在运行print_r($request->getBody()->getContents());
返回字符串foo=bar
方案2发送application/json
数据
POST /path HTTP/1.1
Content-Type: application/json
{
"foo": "bar"
}
运行print_r($request->getParsedBody());
返回一个空数组。 Array ( )
但是,运行print_r($request->getBody()->getContents());
会返回很好:
{"foo":"bar"}
这是预期的行为吗?
意思是,如果我们要发送x-www-form-urlencoded
数据,则应使用getParsedBody()
。
如果我们发送getBody()->getContents()
,则应使用application/json
?
其他信息:
使用以下方法创建请求对象:
$request = \Laminas\Diactoros\ServerRequestFactory::fromGlobals(
$_SERVER, $_GET, $_POST, $_COOKIE, $_FILES
);
在PSR-7库中,消息正文由StreamInterface
抽象。该接口的任何实现都必须包装PHP stream,并且当然应该提供适当的功能以对其执行特定的读/写/查找操作。 PHP提供了一个I / O streams列表,其中php://input
适用于所讨论的任务。
php://input
是只读流,允许您从请求正文中读取原始数据。php://input
在enctype =“ multipart / form-data”中不可用。
在这种情况下,当执行对服务器的请求时,请求主体数据(无论其数据类型如何)都将以原始格式(字符串)自动写入php://input
流。稍后可以通过调用StreamInterface::getContents
,StreamInterface::__toString
或StreamInterface::read
(在其实现中可能会使用stream_get_contents()
或类似名称)从中读取信息。
关于PSR-7,parsed body是其中PHP被_“用作服务器端应用程序来满足HTTP请求的应用程序”的应用程序的“特征”(与PHP用作“ HTTP客户端”)-参见Summary of the PSR-7 Meta Document。因此,parsed body仅是ServerRequestInterface
的组成部分。
parsed body(读取ServerRequestInterface::getParsedBody
和ServerRequestInterface::withParsedBody
的注释)被认为是php://input
流中保存的原始数据(字符串)的表示(执行请求的结果)以“解析”形式(数组或对象)。例如,在下面显示的条件下,$_POST variable保存POST请求的parsed body。
重要用例:
[如果执行POST请求且标头Content-Type
为application/x-www-form-urlencoded
(例如,提交常规HTML表单时),则请求正文的内容将自动保存到php://input
流(序列化)和$ _POST变量(数组)。因此,在PSR-7上下文中,同时调用StreamInterface::getContents
和ServerRequestInterface::getParsedBody
将返回“有效”值。
[如果执行POST请求且标头Content-Type
为multipart/form-data
(例如,在执行文件上传时),则请求正文的内容根本不会保存到php://input
流中,而是仅放入$ _POST变量(数组)。因此,在PSR-7上下文中,仅调用ServerRequestInterface::getParsedBody
会返回“有效”值。
[如果执行了POST请求,并且标头Content-Type
具有不同于上述两个值的值(例如application/json
或text/plain; charset=utf-8
),则请求正文的内容仅保存到php://input
流中。因此,在PSR-7上下文中,仅调用StreamInterface::getContents
会返回“有效”值。