时间:2021-05-18
用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数据之间有什么差异呢?于是我悄悄瞄一眼请求头...
1.表单的请求头部:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,**Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.8,ja;q=0.6Cache-Control: no-cacheConnection: keep-aliveContent-Length: 10Content-Type: application/json;charset=UTF-8Cookie: a0537_times=1Host: 127.0.0.1Origin: http://127.0.0.1Pragma: no-cacheReferer: http://127.0.0.1/angularTest/1.htmlUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36问题一下子就出来了!表单发送的文本类型是表单类型,而angular的ajax默认发送的则是json数据。
那么怎么把Content-type给改了呢?于是我就打开了angular的官网,照着改一下请求头:
$http({ method: 'POST', url: '1.php', data: { id : 1 } headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }).success(function (data) { console.log(data); });于是输出结果为:{"{\"test\":1}":""},还是有问题。对象并没有自动地序列化(jQuery用习惯了都快忘了居然还有这个问题!)
那么解决方案有:
1.不写成对象的形式,直接写字符串:
$http({ method: 'POST', url: '1.php', data: 'test=1', headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }).success(function (data) { console.log(data); });2.重写angular中transformRequest,自己写一个转换方法:
$http({ method: 'POST', url: '1.php', data: $scope.data, headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, transformRequest: function ( data ) { var str = ''; for( var i in data ) { str += i + '=' + data[i] + '&'; } return str.substring(0,str.length-1); } }).success(function (data) { console.log(data); });3.重写angular中的transformRequest,简单粗暴地把jquery拿过来:
$http({ method: 'POST', url: '1.php', data: $scope.data, headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, transformRequest: function ( data ) { return $.param(data); } }).success(function (data) { console.log(data); });4.修改默认的transformations(这个不太熟,先看一眼官网上怎么说的):
Default Transformations
The $httpProvider provider and $http service expose defaults.transformRequest and defaults.transformResponse properties. If a request does not provide its own transformations then these will be applied.You can augment or replace the default transformations by modifying these properties by adding to or replacing the array.Angular provides the following default transformations:Request transformations ($httpProvider.defaults.transformRequest and $http.defaults.transformRequest):If the data property of the request configuration object contains an object, serialize it into JSON format.Response transformations ($httpProvider.defaults.transformResponse and $http.defaults.transformResponse):If XSRF prefix is detected, strip it (see Security Considerations section below).If JSON response is detected, deserialize it using a JSON parser.然后照抄:
app.config(['$httpProvider', function ( $httpProvider ) { $httpProvider.defaults.transformRequest = function ( data ) { var str = ''; for( var i in data ) { str += i + '=' + data[i] + '&'; } return str.substring(0,str.length-1); } }]);<code class="language-javascript">$http({ method: 'POST', url: '1.php', data: $scope.data, headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }).success(function (data) { console.log(data); });</code>以上这篇快速解决angularJS中用post方法时后台拿不到值的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
1.问题:后端接收不到AngularJs中$http.post发送的数据,总是显示为null示例代码:$http.post(/admin/KeyValue/Ge
在action中用get方法获得参数,如果参数里有"+",要做处理,否则到后台会变成空格。解决方案:1、改用post方法;2、在js里用url=encodeUR
本文实例讲述了Python使用迭代器捕获Generator返回值的方法。分享给大家供大家参考,具体如下:用for循环调用generator时,发现拿不到gene
问题描述在使用vue-axios向后端post数据时,PHP端获取不到post的数据。问题解决修改php.ini配置找到php.ini配置文件,查找enable
在cordova开发的时候使用到了$http的post方法,传递的参数服务端怎么都接收不到,搜索了下,发现使用AngularJS通过POST传递参数还是需要设置