快速解决angularJS中用post方法时后台拿不到值的问题


Posted in Javascript onAugust 14, 2018

用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,*/*;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.36

2.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方法时后台拿不到值的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
让AJAX不依赖后端接口实现方案
Dec 03 Javascript
在javascript中对于DOM的加强
Apr 11 Javascript
判断javascript的数据类型(示例代码)
Dec 11 Javascript
Jquery on方法绑定事件后执行多次的解决方法
Jun 02 Javascript
React利用插件和不用插件实现双向绑定的方法详解
Jul 03 Javascript
JavaScript中数组常见操作技巧
Sep 01 Javascript
JavaScript中如何判断一个值的类型
Sep 15 Javascript
VUE 实现复制内容到剪贴板的两种方法
Apr 24 Javascript
小程序实现图片预览裁剪插件
Nov 22 Javascript
vue中英文切换实例代码
Jan 21 Javascript
jQuery实现小火箭返回顶部特效
Feb 03 jQuery
vue在响应头response中获取自定义headers操作
Jul 24 Javascript
详解angular应用容器化部署
Aug 14 #Javascript
使用node.js实现微信小程序实时聊天功能
Aug 13 #Javascript
JQuery通过后台获取数据遍历到前台的方法
Aug 13 #jQuery
AngularJS实现与后台服务器进行交互的示例讲解
Aug 13 #Javascript
JS实现把一个页面层数据传递到另一个页面的两种方式
Aug 13 #Javascript
Angularjs 根据一个select的值去设置另一个select的值方法
Aug 13 #Javascript
AngularJS中ng-options实现下拉列表的数据绑定方法
Aug 13 #Javascript
You might like
php数组函数序列之array_intersect() 返回两个或多个数组的交集数组
2011/11/10 PHP
php-app开发接口加密详解
2018/04/18 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题分析
2007/08/12 Javascript
JavaScript delete 属性的使用
2009/10/08 Javascript
JS设置获取cookies的方法
2014/01/26 Javascript
jQuery使用之标记元素属性用法实例
2015/01/19 Javascript
jQuery.position()方法获取不到值的安全替换方法
2015/03/13 Javascript
完美兼容多浏览器的js判断图片路径代码汇总
2015/04/17 Javascript
jquery实现的代替传统checkbox样式插件
2015/06/19 Javascript
JavaScript判断数组是否包含指定元素的方法
2015/07/01 Javascript
Javascript编写俄罗斯方块思路及实例
2015/07/07 Javascript
jQuery动画效果实现图片无缝连续滚动
2016/01/12 Javascript
js的form表单提交url传参数(包含+等特殊字符)的两种解决方法
2016/05/25 Javascript
js 获取当前web应用的上下文路径实现方法
2016/08/19 Javascript
详解JS异步加载的三种方式
2017/03/07 Javascript
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
如何使用CSS3+JQuery实现悬浮墙式菜单
2019/06/18 jQuery
JS实现水平遍历和嵌套递归操作示例
2019/08/15 Javascript
解决python3 urllib中urlopen报错的问题
2017/03/25 Python
Python实现的多线程同步与互斥锁功能示例
2017/11/30 Python
python3+dlib实现人脸识别和情绪分析
2018/04/21 Python
python 实现12bit灰度图像映射到8bit显示的方法
2019/07/08 Python
详解PANDAS 数据合并与重塑(join/merge篇)
2019/07/09 Python
python接口调用已训练好的caffe模型测试分类方法
2019/08/26 Python
Python安装whl文件过程图解
2020/02/18 Python
Python3+Django get/post请求实现教程详解
2021/02/16 Python
中国茶叶、茶具一站式网上购物商城:醉品茶城
2018/07/03 全球购物
Nike瑞典官方网站:Nike.com (SE)
2018/11/26 全球购物
吉力贝官方网站:Jelly Belly
2019/03/11 全球购物
大学军训自我鉴定
2013/12/15 职场文书
建筑工程毕业生自我鉴定
2014/01/14 职场文书
《花的勇气》教后反思
2014/02/12 职场文书
销售团队口号大全
2014/06/06 职场文书
小学生春游活动方案
2014/08/20 职场文书
《三国志》赏析
2019/08/27 职场文书