用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中的值:
<"htmlcode"><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,*/*;q=0.8 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.8,ja;q=0.6 Cache-Control: no-cache Connection: keep-alive Content-Length: 5 Content-Type: application/x-www-form-urlencoded Cookie: a0537_times=1 Host: 127.0.0.1 Origin: http://127.0.0.1 Pragma: no-cache Referer: http://127.0.0.1/angularTest/1.html Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.362.ajax发送的数据的请求头部:
Accept: application/json, text/plain, */* Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.8,ja;q=0.6 Cache-Control: no-cache Connection: keep-alive Content-Length: 10 Content-Type: application/json;charset=UTF-8 Cookie: a0537_times=1 Host: 127.0.0.1 Origin: http://127.0.0.1 Pragma: no-cache Referer: http://127.0.0.1/angularTest/1.html User-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方法时后台拿不到值的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]