angular使用post、get向后台传参的问题实例


Posted in Javascript onMay 27, 2017

一、问题的来源

我们都知道向后台传参可以使用get、put,其形式就类似于name=jyy&id=001。但是在ng中我却发现使用$http post进行异步传输的过程中后台是接收不到数据的。其实这个问题是因为请求头的缘故。在ng中默认的请求头是:“Content-Type":"application/json",也就是说传递参数是使用的就是json格式。但是后台默认的却是Content-Type': 'application/x-www-form-urlencoded'。因此在这样的情况下后台接收到的数据就会是空的。

那么为什么使用get形式就可以传参呢?在书中我发现这样的一句话:”这个键的值是一个字符串map或对象,会被转换成查询字符串追加在URL后面。如果值不是字符串,会被JSON序列化”,可以理解为在get中参数的传递是直接追加在url后面的,那么此时参数形式{"id":"1","name":"jyy"}会被转化成id=1&name=jyy追加在url后面。那么在后台中就可以直接获取到了。例如:

var app = angular.module('app',[]);
    app.controller('ctrl',function($scope,$q,$http){
      var defer = $q.defer();
      var promise = defer.promise;
      $http({
        method: "get",
        params:{id:1,name:jyy},
        url:"1.php"
      }).success(function(data){
        defer.resolve(data);
      });
      promise.then(function(data){
        $scope.data = data;
      })
    })

在后台(PHP)输入echo $_GET[id]就可以正常显示了。

那么接下来就研究怎么解决post的传值了。

二、问题的解决

1. 修改请求头

第一种方法就是在ng中修改请求头将json格式改成x-www-form-urlencoded。修改方法点击即可查看。

值得注意的是,在使用第二种方法时,可以修改put,get,post,common的传参格式。因此修改哪种方式,就只能使用这种方式才能在后台得到参数。这篇博文写到使用common进行设置可以同时使用put、get、post进行传参。但是在我的实际操作中发现对common进行修改并不能使用post进行传参,而只有设置了post的请求头才可以。

另外由于在ng中的参数都是使用json格式表达,因此需要引入jquery,使用其$.param("参数列表的json格式")进行序列化表示。

首先使用修改post请求头。具体代码如下:

var app = angular.module('app');

    app.config(function($httpProvider){
      $httpProvider.defaults.headers.post = { 'Content-Type': 'application/x-www-form-urlencoded' }
    })
    app.controller('ctrl',function($scope,$resource,$q,$http){
      var defer = $q.defer();
      var promise = defer.promise;
      $http({
        method: "post",
        data:$.param({"id":"1","name":"jyy"}),
        url:"1.php"
      }).success(function(data){
        defer.resolve(data);
      });
      promise.then(function(data){
        $scope.data = data;
      })
    })

此时在后台中(使用的是php),输入echo $_POST[id],就会显示。而debug其中显示的请求头正是我们设置的。

2.在后台进行解决

由于使用的是php,所以暂时用php的方法解决。在这个方法中,我们不修改请求头。因为get传值是正常的,那么,只要能够得到post的值就好。既然ng向后台传值了,即便是因为请求头不同,但是总会传过来什么的吧,既然能够传过来,就先获取它。这个时候使用$GLOBALS['HTTP_RAW_POST_DATA']将这个传过来的东西显示出来。那么这个$GLOBALS['HTTP_RAW_POST_DATA']是什么呢?在网上查询得知$HTTP_RAW_POST_DATA 变量包含有原始的 POST 数据。此变量仅在碰到未识别 MIME 类型的数据时产生,PHP不能识别的Content-Type类型的时候,会将http请求包中相应的数据填入变量$HTTP_RAW_POST_DATA。就是说现在这个请求头虽然是有冲突的,但是却能够显示出来。如下:

var app = angular.module('app',[]);
    app.controller('ctrl',function($scope,$q,$http){
      var defer = $q.defer();
      var promise = defer.promise;
      $http({
        method: "post",
        data:{'id':'1','name':'jyy'},
        url:"1.php"
      }).success(function(data){
        defer.resolve(data);
      });
      promise.then(function(data){
        $scope.data = data;
      })
    })

php代码:

echo $GLOBALS['HTTP_RAW_POST_DATA'];

此时显示出来的东西是:{"id":"1","name":"jyy"}。发现这个结果是正确显示了。那么直接对齐进行操作不就可以了?好吧,那就先看看是什么类型:使用gettype()得到的是string,就是说他是个json字符串。那就使用json_decode()转换,发现会报错。好吧,放弃使用这个方法。

但是此时还有另外的方法。使用file_get_contents("php://input"),这个方法中 php://input 是个可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。 此时这个方法就可以返回传过来的参数了。代码如下:

$a = json_decode(file_get_contents("php://input"));
  echo $a->id;

结果输出正确的id。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木

Javascript 相关文章推荐
javascript中获取选中对象的类型
Apr 02 Javascript
js检测客户端不是firefox则提示下载
Apr 07 Javascript
javascript网页关闭时提醒效果脚本
Oct 22 Javascript
CSS+Table图文混排中实现文本自适应图片宽度(超简单+跨所有浏览器)
Feb 14 Javascript
用示例说明filter()与find()的用法以及children()与find()的区别分析
Apr 26 Javascript
JS通过Cookie判断页面是否为首次打开
Feb 05 Javascript
BackBone及其实例探究_动力节点Java学院整理
Jul 14 Javascript
JS计算两个时间相差分钟数的方法示例
Jan 10 Javascript
vue上传图片到oss的方法示例(图片带有删除功能)
Sep 27 Javascript
Vue.js 事件修饰符的使用教程
Nov 01 Javascript
Angular Excel 导入与导出的实现代码
Apr 17 Javascript
解决LayUI加上form.render()下拉框和单选以及复选框不出来的问题
Sep 27 Javascript
AngularJS中使用ngModal模态框实例
May 27 #Javascript
angularJS模态框$modal实例代码
May 27 #Javascript
AngularJS入门教程二:在路由中传递参数的方法分析
May 27 #Javascript
AngularJS入门教程一:路由用法初探
May 27 #Javascript
Angular 4环境准备与Angular cli创建项目详解
May 27 #Javascript
BootStrap Table 后台数据绑定、特殊列处理、排序功能
May 27 #Javascript
Angularjs自定义指令Directive详解
May 27 #Javascript
You might like
php数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
一个PHP的远程图片抓取函数分享
2013/09/25 PHP
PHP 根据key 给二维数组分组
2016/12/09 PHP
数组Array进行原型prototype扩展后带来的for in遍历问题
2010/02/07 Javascript
超酷的网页音乐播放器DewPlayer使用方法
2010/12/18 Javascript
javascript实现图片自动和可控的轮播切换特效
2015/04/13 Javascript
JavaScript中Boolean对象的属性解析
2015/10/21 Javascript
jQuery EasyUI 页面加载等待及页面等待层
2017/02/06 Javascript
Bootstrap学习笔记 轮播(Carousel)插件
2017/03/21 Javascript
Vue仿手机qq的实例代码(demo)
2017/09/08 Javascript
nodejs+mongodb+vue前后台配置ueditor的示例代码
2018/01/02 NodeJs
Node.js Buffer模块功能及常用方法实例分析
2019/01/05 Javascript
原理深度解析Vue的响应式更新比React快
2020/04/04 Javascript
Vue数据双向绑定原理实例解析
2020/05/15 Javascript
JavaScript实现鼠标移入随机变换颜色
2020/11/24 Javascript
[19:14]DOTA2 HEROS教学视频教你分分钟做大人-维萨吉
2014/06/24 DOTA
[03:34]2014DOTA2西雅图国际邀请赛 淘汰赛7月15日TOPPLAY
2014/07/15 DOTA
使用C语言扩展Python程序的简单入门指引
2015/04/14 Python
Python导入oracle数据的方法
2015/07/10 Python
Python list列表中删除多个重复元素操作示例
2019/02/27 Python
PyQt QCombobox设置行高的方法
2019/06/20 Python
python离线安装外部依赖包的实现
2020/02/13 Python
python-sys.stdout作为默认函数参数的实现
2020/02/21 Python
Python基于百度AI实现OCR文字识别
2020/04/02 Python
MyFrenchPharma中文网:最大的法国药妆平台
2016/10/07 全球购物
THE OUTNET美国官网:国际设计师品牌折扣网站
2017/03/07 全球购物
Hudson Jeans官网:高级精制牛仔裤
2018/11/28 全球购物
亚洲颇具影响力的男性在线购物零售商:His
2019/11/24 全球购物
知识竞赛活动方案
2014/02/18 职场文书
活动总结报告格式
2014/05/09 职场文书
党员查摆四风问题思想汇报
2014/10/25 职场文书
销售经理岗位职责
2015/01/31 职场文书
工伤事故赔偿协议书
2015/08/06 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书
Python 数据可视化之Bokeh详解
2021/11/02 Python
MySQL安装失败的原因及解决步骤
2022/06/14 MySQL