PSR-7:getParsedBody()vs getBody()

问题描述 投票:0回答:1

方案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
);
php json post http-post psr-7
1个回答
0
投票

消息正文:

在PSR-7库中,消息正文StreamInterface抽象。该接口的任何实现都必须包装PHP stream,并且当然应该提供适当的功能以对其执行特定的读/写/查找操作。 PHP提供了一个I / O streams列表,其中php://input适用于所讨论的任务。

php://input是只读流,允许您从请求正文中读取原始数据。php://inputenctype =“ multipart / form-data”中不可用。

在这种情况下,当执行对服务器的请求时,请求主体数据(无论其数据类型如何)都将以原始格式(字符串)自动写入php://input流。稍后可以通过调用StreamInterface::getContentsStreamInterface::__toStringStreamInterface::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::getParsedBodyServerRequestInterface::withParsedBody的注释)被认为是php://input流中保存的原始数据(字符串)的表示(执行请求的结果)以“解析”形式(数组或对象)。例如,在下面显示的条件下,$_POST variable保存POST请求的parsed body

重要用例:

[如果执行POST请求且标头Content-Typeapplication/x-www-form-urlencoded(例如,提交常规HTML表单时),则请求正文的内容将自动保存到php://input流(序列化)和$ _POST变量(数组)。因此,在PSR-7上下文中,同时调用StreamInterface::getContentsServerRequestInterface::getParsedBody将返回“有效”值。

[如果执行POST请求且标头Content-Typemultipart/form-data(例如,在执行文件上传时),则请求正文的内容根本不会保存到php://input流中,而是仅放入$ _POST变量(数组)。因此,在PSR-7上下文中,仅调用ServerRequestInterface::getParsedBody会返回“有效”值。

[如果执行了POST请求,并且标头Content-Type具有不同于上述两个值的值(例如application/jsontext/plain; charset=utf-8),则请求正文的内容仅保存到php://input流中。因此,在PSR-7上下文中,仅调用StreamInterface::getContents会返回“有效”值。


资源:

  • PSR-7 Meta Document
  • How to get body of a POST in php?
  • PHP "php://input" vs $_POST
  • php://input - what does it do in fopen()?(对答案的评论)
  • © www.soinside.com 2019 - 2024. All rights reserved.