快速解决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 相关文章推荐
JavaScript 使用技巧精萃(.net html
Apr 25 Javascript
JS检测输入字符是否包含非法字符的示例代码
Feb 11 Javascript
jquery实现省市select下拉框的替换(示例代码)
Feb 22 Javascript
JS中的log对象获取以及debug的写法介绍
Mar 03 Javascript
jscript读写二进制文件的方法
Apr 22 Javascript
EasyUI创建对话框的两种方式
Aug 23 Javascript
javascript表达式和运算符详解
Feb 07 Javascript
vue.js的安装方法
May 12 Javascript
vue中将网页打印成pdf实例代码
Jun 15 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
Feb 23 Javascript
vue bus全局事件中心简单Demo详解
Feb 26 Javascript
详解用场景去理解函数柯里化(入门篇)
Apr 11 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
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
php获取客户端IP及URL的方法示例
2017/02/03 PHP
html读出文本文件内容
2007/01/22 Javascript
javascript IE中的DOM ready应用技巧
2008/07/23 Javascript
JQuery跨Iframe选择实现代码
2010/08/19 Javascript
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
2013/05/24 Javascript
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
JavaScript程序员应该知道的45个实用技巧
2014/03/04 Javascript
jQuery实现级联下拉框实战(5)
2017/02/08 Javascript
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
基于ionic实现下拉刷新功能
2018/05/10 Javascript
vue加载完成后的回调函数方法
2018/09/07 Javascript
微信小程序利用swiper+css实现购物车商品删除功能
2019/03/06 Javascript
深入浅析ng-bootstrap 组件集中 tabset 组件的实现分析
2019/07/19 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
2020/08/12 Javascript
Python获取单个程序CPU使用情况趋势图
2015/03/10 Python
发布你的Python模块详解
2016/09/15 Python
基于Python socket的端口扫描程序实例代码
2018/02/09 Python
python输出带颜色字体实例方法
2019/09/01 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
2020/02/11 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
2020/02/20 Python
解决Keras使用GPU资源耗尽的问题
2020/06/22 Python
Python 解析简单的XML数据
2020/07/24 Python
Windows下pycharm安装第三方库失败(通用解决方案)
2020/09/17 Python
魅力惠奢品线上平台:MEI.COM
2016/11/29 全球购物
Holiday Inn中国官网:IHG旗下假日酒店预订
2018/04/08 全球购物
日语专业推荐信
2013/11/12 职场文书
师范应届毕业生自荐信
2013/11/18 职场文书
临床护士自荐信
2014/01/31 职场文书
幼师自我鉴定
2014/02/01 职场文书
三月法制宣传月活动总结
2014/07/03 职场文书
房产转让协议书(2014版)
2014/09/30 职场文书
水电施工员岗位职责
2015/04/11 职场文书
小学大队委竞选口号
2015/12/25 职场文书
《我和小伙伴》教学反思
2016/02/20 职场文书
2019入党申请书格式
2019/06/25 职场文书