Symfony post 请求正文参数?

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

我正在通过带标题的邮递员发送 POST 请求

application/json
和身体:

{
    "name": "user"
}

当我尝试从请求对象中获取此参数时

$request->request->get('name')
我没有了。 但是当我使用
$request->getContent()
时,我收到原始字符串。

看起来我的请求没有被正确解析。请求有什么问题?

更新:

原来文档对此不清楚,我需要手动将 body 转换为 json。真的不明白为什么不默认在框架中这样做。

rest symfony postman
5个回答
44
投票

这是预期的行为。您正在请求正文中发送一个 JSON 字符串。

在这种情况下,您需要 json_decode 将 JSON 字符串转换为数组或对象,以便访问数据。

$parameters = json_decode($request->getContent(), true);
echo $parameters['name']; // will print 'user'

9
投票

虽然接受的答案是正确的,但我想在这里补充一点,有两种方法。

$payload = json_decode($request->getContent(), true);
echo $payload['name']; // will print 'user'

$payload = json_decode($request->getContent(), false);
echo $payload->name; // will print 'user'

默认情况下,json_decode 返回一个对象,除非第二个参数另有指定。

  • true:数组
  • false:对象(默认)

2
投票

Cacanode 的回答是正确的——你可以从 $request->getContent() 解码 json

但是,如果你想让你的生活更轻松,你可以考虑使用 FOSRestBundle。特别是“body_listener”功能:https://symfony.com/doc/master/bundles/FOSRestBundle/body_listener.html

这个包已经安装了 JSON 和 XML 解码器——如果你愿意,你可以添加一些新的自定义解码器。


0
投票

如果你想将请求主体解码为数组,有一个方便的辅助方法称为

toArray
。您可以在 Symfony 文档

中阅读有关访问请求数据的更多信息
$request->toArray();

-1
投票

使用 Symfony 4.3,您可以使用组件:

...
use Symfony\Component\HttpFoundation\Request;

...

public function doSomething(Request $request){
        $a = json_decode($request->getContent(), true);

        return $this->json($a);
}

这将返回您发送的相同 json 对象。

© www.soinside.com 2019 - 2024. All rights reserved.