我正在使用带有角度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)
);
答案 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监听器来为你处理这个问题。