调试器在请求中显示 POST数据,但我无法通过$request->get('foo');
获取
$request->request->all();
给出数组[0]
。
我的Ajax POST请求(由AngularJS提供):
...
$http.post('http://admin/about-company/setJSONObj',
{foo: 'bar'}
);
我的控制器在评论中有调试信息(Symfony 3.2.9):
use Symfony\Component\HttpFoundation\Request;
...
public function updateAction(Request $request)
{
$foo = $request->get('foo'); // null
$requestType = $request->getContentType(); // json
$content = $request->getContent(); // {"foo":"bar"}
我在Symfony 2.7项目中使用了这些方法,它运行良好,但我不确定,在这种情况下发生了什么?
另外,也许有任何Symfony框架配置变量告诉不要解析POST数据,或者在缓存请求时隐藏它?
答案 0 :(得分:1)
对于POST请求是:
if (e.keyCode == 13) {
e.preventDefault()
e.target.blur()
window.getSelection().removeAllRanges()
}
答案 1 :(得分:0)
尝试将FormData用于客户端ajax的调用
例如:尝试类似
的内容var formData = new FormData();
formData.append('foo', 'bar')
$http.post('http://url',
formData
);
好的,我没注意你用json这样,
您不会在请求中获得$ foo的内容,但您需要json_decode $content
所以保持发送数据的方式相同:
$http.post('http://admin/about-company/setJSONObj', {foo: 'bar'} );
你只需要打电话
use Symfony\Component\HttpFoundation\Request;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
...
/**
* @Route("/setJSONObj", name="admin_pages_set_ajax_obj")
* @Method("POST")
*/
public function updateAction(Request $request)
{
$foo = $request->get('foo'); // null
$requestType = $request->getContentType(); // json
$content = $request->getContent(); // {"foo":"bar"}
$data = json_decode($content, true);
dump($data['foo']); // "foo"
//And you can know replace the data of the request. So
$request->request->replace($data);
我的猜测是因为symfony需要'Content-Type'
'application/x-www-form-urlencoded'
,但默认情况下Angular会有application/json
(因此您可以覆盖$http.post
来电时的标头。
答案 2 :(得分:0)
事实证明,我的错误是在发布JSON时期望$request->request->all();
中的POST变量:请参阅解释https://www.toptal.com/...。
要使用Symfony创建REST api,使用FOSRestBundle是正常的:请参阅body listener。所以,它以优雅的方式解决了我的问题。
此外,@henrily建议有人可以使用workaroud,但这只是一种解决方法。