邮件正文:
在 PSR-7 库中,消息体由StreamInterface
. 这个接口的任何实现都必须包装一个PHP 流,当然,应该提供适当的功能来对其执行特定的读/写/搜索操作。PHP 提供了一个 I/O流列表,从中php://input
可以找到适合所讨论的任务。
php://input
是一个只读流,允许您从请求正文中读取原始数据。php://input
不适用于enctype="multipart/form-data"。
在这种情况下,当执行对服务器的请求时,请求主体数据(无论其数据类型如何)会自动以原始格式(字符串)写入php://input
流。稍后可以通过调用StreamInterface::getContents
、StreamInterface::__toString
或StreamInterface::read
(在其实现中可能会使用stream_get_contents()
或类似的)从中读取信息。
注意:StreamInterface::__toString
当表示消息体的对象(例如实现的类的实例)StreamInterface
被强制转换为字符串该方法例如,像这样 - 请参阅PHP 中的类型转换:
$messageBodyObject = $request->getBody(); // implements StreamInterface
$contentOfMessageBody = (string) $messageBodyObject; // cast to string => StreamInterface::__toString is called
echo $contentOfMessageBody;
解析体:
就 PSR-7 而言,解析后的主体是“将 PHP用作服务器端应用程序来满足 HTTP 请求”的应用程序的“特征” (与将 PHP 用作“HTTP 客户端”的应用程序相比) " ) - 参见PSR-7 元文档摘要。所以,解析后的body是ServerRequestInterface
唯一的一个组件。
解析后的主体(阅读ServerRequestInterface::getParsedBody
and的注释)被认为是作为执行请求的结果而ServerRequestInterface::withParsedBody
保存在流中的原始数据(字符串)的“解析”形式(数组或对象)的表示。php://input
例如,$_POST 变量是一个数组,在下面给出的条件下保存 POST 请求的解析主体。
相关用例:
如果执行 POST 请求并且标头Content-Type
是application/x-www-form-urlencoded
(例如提交普通 HTML 表单时),则请求正文的内容会自动保存到php://input
流(序列化)和 $_POST 变量(数组)中。因此,在 PSR-7 上下文中,同时调用StreamInterface::getContents
(or StreamInterface::__toString
, or StreamInterface::read
)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
(or StreamInterface::__toString
, or StreamInterface::read
) 会返回一个“有效”值。
资源: