1、问题描述
用angularJS中的$http服务碰到了一个问题:运用$http.post方法向后台传递数据时,后台的php页面获取不到data参数传过来的值。 不论是这种姿势:$http.post( "1.php", { id: 1 }).success(function (data) { console.log(data); });
还是这种姿势:$http({ method: 'POST', url: '1.php', data: { id: 1 } }).success(function (data) { console.log(data); });
后台php中的$_POST或$_REQUEST都无法获取到data中的值:<?php echo json_encode($_POST); ?>
输出为一个空数组。为了测试php本身是不是真的获取不到值,我就写了个表单测试下:<form action="1.php" method="post"> <input type="text" name="tid"> <input type="submit" value="submit"> </form>
输出结果为:{"tid":"2"},也就是说表单里的值是可以获取的,但是用ajax发送的数据获取不了!那么表单数据和ajax发送的post数据之间有什么差异呢?于是我悄悄瞄一眼请求头...
打开firebug发现其实传成功了,折腾了好半天才发现,它只不过传输的格式与普通的传输格式比如jQuery里的$.post()方法传输的格式不同,$http.post()是以json格式传输,而$.post()是以表单参数形式传输,而php的$.POST[]是期待以后者的形式接收前台传输过来的数据的,因此读取不到json传的数据。 问题一下子就出来了!表单发送的文本类型是表单类型,而angular的ajax默认发送的则是json数据。 2、解决
I、.简单粗暴的直接改成$.post()方法,这样后台不用作任何修改,但是网上一些比较有经验的网友称这样可能违背使用angular的初衷。
II、引用JQuery,使用JQuery的$.param()方法序列化参数后传递
$http({ method : 'POST', url: 'process.php', data: $.param($scope.formData), //序列化参数 headers: { 'Content-Type': 'application/x-www-form-urlencoded' } ) })
III、
使用file_get_contents("php://input")获取再处理$input = file_get_contents("php://input",true); echo $input;
VI、
修改Angular的$httpProvider的默认处理(参考:http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax