使用角度4在symfony中接收POST参数的困难

时间:2017-07-31 14:17:59

标签: php angular symfony

我正在使用带有角度4的symfony。两者都是不同的项目。在symfony中,我返回一个post变量,它通过angular发送。我只是回报了价值。除此之外别无他物。

但它让我失去了空白价值。但是当我使用邮递员测试那个symfony网址时,它会返回正确的值。

Symfony代码

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST');
header('Access-Control-Allow-Headers:Content-Type,Accept');

return new Response("a-".$request->request->get('roll')."-b"); //gives  '**a- -b**' in console. but from postman gives `a-2-b`

角度代码

this.http.post("http://localhost:8000/user/login",{roll:2}).subscribe(
      (data) => console.log(data)
);

2 个答案:

答案 0 :(得分:0)

你的邮递员的POST请求与Angular的POST请求不同 也许在Angular中你必须添加content-type: application/json标题。

要进行调试,我建议您将两个请求与登录symfony代码进行比较

答案 1 :(得分:0)

我不是100%肯定,但我相信你必须在角度方面JSON.stringify你的对象:

this.http.post("http://localhost:8000/user/login",JSON.stringify({roll:2})).subscribe(
      (data) => console.log(data)
);

接下来,如上面的评论所述。 Symfony默认处理x-www-form-urlencoded主体。对于JSON请求,您需要自己解析它。

e.g:

$data = json_decode($request->getContent(), true));

现在在每个控制器动作中执行此操作可能看起来很乏味,并且您将松开Symfony Parameter包。

您可以通过发出请求侦听器来解决此问题:

e.g:

class JsonRequestEventListener
{
    public function onKernelRequest(GetResponseEvent $event)
    {
        $request = $event->getRequest();
        if (empty($request->getContent()))
        {
            return;
        }
        if (!$this->isJsonRequest($request))
        {
            return;
        }
        if (!$this->transformJsonBody($request))
        {
            $response = Response::create('Unable to parse request.', 400);
            $event->setResponse($response);
        }
    }

    private function isJsonRequest(Request $request)
    {
        return 'json' === $request->getContentType();
    }

    private function transformJsonBody(Request $request)
    {
        $content = $request->getContent();
        if ($content === '')
        {
            return true;
        }
        $data = json_decode($content, true);
        if (json_last_error() !== JSON_ERROR_NONE)
        {
            return false;
        }
        if ($data === null)
        {
            return true;
        }
        $request->request->replace($data);

        return true;
    }
}

该听众的作用如下:

当请求进入时,它会检查是否有任何内容以及请求是否为json。然后它尝试对请求进行json_decode并将其插入请求参数包中。 ($ request-> request ...)

接下来你要做的就是注册这个监听器:

e.g:

jsonrequest.listener:
        class: AppBundle\EventListener\JsonRequestEventListener
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 100 }

从现在开始,如果您的请求是application / json类型并且它包含有效的json,您可以在Request Parameter包中找到它的值:

public function someAction(Request $request)
{
    $request->request->all() //holds the json
}

正如我从您的示例中看到的那样,您也可以在控制器中设置CORS标头。你可以用同样的方式编写一个CORS监听器来为你处理这个问题。