AngularJs的$http发送POST请求,php无法接收Post的数据问题及解决方案


Posted in Javascript onAugust 13, 2020

最近在使用AngularJs+Php开发中遇到php后台无法接收到来自AngularJs的数据,在网上也有许多解决方法,却都点到即止.多番摸索后记录下解决方法:

tips:当前使用的AngularJs版本为v1.5.0-rc.0

原因分析:

在使用jquery的时候进行post请求的时候很简单.

$.ajax({
 type: 'POST',
 url:'process.php',
 data: formData,
 dataType: 'json',
 success: function(result){
 //do something
 }
 });

对这个传输的数据我们一般会直接使用serialize()或使用serializeArray()处理后再传输,但在发送post请求时jquery会把这个对象转换为字符串后再发送,类似"a=123&b=456".
而AngularJs传输的是一个Json数据而不是一个转换后的字符串,在php端接收的时候不能直接使用$_POST方式接收.这样是获取不到数据的.
$POST方式只能接收Content-Type: application/x-www-form-urlencoded提交的数据,也就是表单提交的数据.
但可以使用file_get_contents("php://input")接收,对于没有没有指定Content-Type的Post数据也是可以接收到的,此时获取到的是个字符串还需要再转换才能变成我们想要的数据格式.这样无疑增加了工作量.

解决方案:

1.引用JQuery,使用JQuery的$.param()方法序列化参数后传递

$http({
 method : 'POST',
 url: 'process.php',
 data: $.param($scope.formData), //序列化参数
 headers: { 'Content-Type': 'application/x-www-form-urlencoded' } )
}) 

2.使用file_get_contents("php://input")获取再处理

$input = file_get_contents("php://input",true);
echo $input; 

3.修改Angular的$httpProvider的默认处理(参考:http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/)

// Your app's root module...
angular.module('MyModule', [], function($httpProvider) {
 // Use x-www-form-urlencoded Content-Type
 $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
 
 /**
 * The workhorse; converts an object to x-www-form-urlencoded serialization.
 * @param {Object} obj
 * @return {String}
 */
 var param = function(obj) {
 var query = '', name, value, fullSubName, subName, subValue, innerObj, i;
 
 for(name in obj) {
 value = obj[name];
 
 if(value instanceof Array) {
 for(i=0; i<value.length; ++i) {
 subValue = value[i];
 fullSubName = name + '[' + i + ']';
 innerObj = {};
 innerObj[fullSubName] = subValue;
 query += param(innerObj) + '&';
 }
 }
 else if(value instanceof Object) {
 for(subName in value) {
 subValue = value[subName];
 fullSubName = name + '[' + subName + ']';
 innerObj = {};
 innerObj[fullSubName] = subValue;
 query += param(innerObj) + '&';
 }
 }
 else if(value !== undefined && value !== null)
 query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&';
 }
 
 return query.length ? query.substr(0, query.length - 1) : query;
 };
 
 // Override $http service's default transformRequest
 $httpProvider.defaults.transformRequest = [function(data) {
 return angular.isObject(data) && String(data) !== '[object File]' ? param(data) : data;
 }];
});
$http({
 method:"POST",
 url:"/api/login.php",
 data:$scope.Account
});

补:

php获取时也可通过$GLOBALS['HTTP_RAW_POST_DATA']获取POST提交的原始数据.

$GLOBALS['HTTP_RAW_POST_DATA']中是否保存POST过来的数据取决于centent-Type的设置,即POST数据时 必须显式示指明Content-Type: application/x-www-form-urlencoded,POST的数据才会存放到 $GLOBALS['HTTP_RAW_POST_DATA']中.

总结

到此这篇关于AngularJs的$http发送POST请求,php无法接收Post的数据解决方案的文章就介绍到这了,更多相关AngularJs的$http发送POST请求内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JS 强制设为首页的代码
Jan 31 Javascript
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
Apr 01 Javascript
JavaScript 面向对象编程(1) 基础
May 18 Javascript
jQuery之网页换肤实现代码
Apr 30 Javascript
Javascript事件实例详解
Nov 06 Javascript
中止javascript执行的方法
Feb 14 Javascript
javascript setinterval 的正确语法如何书写
Jun 17 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
Mar 24 Javascript
AngularJs定时器$interval 和 $timeout详解
May 25 Javascript
微信小程序上传图片到服务器实例代码
Nov 07 Javascript
微信小程序授权登录及解密unionId出错的方法
Sep 26 Javascript
原生js实现轮播图特效
May 04 Javascript
VsCode里的Vue模板的实现
Aug 12 #Javascript
typescript配置alias的详细步骤
Aug 12 #Javascript
js实现表格单列按字母排序
Aug 12 #Javascript
javascript的hashCode函数实现代码小结
Aug 11 #Javascript
vue axios封装httpjs,接口公用配置拦截操作
Aug 11 #Javascript
解决vue刷新页面以后丢失store的数据问题
Aug 11 #Javascript
封装 axios+promise通用请求函数操作
Aug 11 #Javascript
You might like
PHP之COOKIE支持详解
2010/09/20 PHP
php取整函数ceil,floo,round的用法及介绍
2013/08/31 PHP
php+mysql实现无限分类实例详解
2015/01/15 PHP
php代码检查代理ip的有效性
2016/08/19 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
Yii框架Session与Cookie使用方法示例
2019/10/14 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
超强的IE背景图片闪烁(抖动)的解决办法
2007/09/09 Javascript
jQuery 类twitter的文本字数限制带提示效果插件
2010/04/16 Javascript
基于jQuery实现下拉收缩(展开与折叠)特效
2012/12/25 Javascript
关于Javascript与iframe的那些事儿
2013/07/04 Javascript
jQuery超简单选项卡完整实例
2015/09/26 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
Bootstrap开发实战之第一次接触Bootstrap
2016/06/02 Javascript
关于JS中setTimeout()无法调用带参函数问题的解决方法
2016/06/21 Javascript
使用nodejs爬取前程无忧前端技能排行
2017/05/06 NodeJs
Angular5中调用第三方库及jQuery的添加的方法
2018/06/07 jQuery
在vue中使用公共过滤器filter的方法
2018/06/26 Javascript
微信小程序自定义键盘 内部虚拟支付
2018/12/20 Javascript
基于Three.js实现360度全景图片
2018/12/30 Javascript
微信小程序JS加载esmap地图的实例详解
2019/09/04 Javascript
浅谈VUE中演示v-for为什么要加key
2020/01/16 Javascript
[03:12]完美世界DOTA2联赛PWL DAY6集锦
2020/11/05 DOTA
Python函数嵌套实例
2014/09/23 Python
Python基础之文件读取的讲解
2019/02/16 Python
Python collections模块使用方法详解
2019/08/28 Python
Python3 把一个列表按指定数目分成多个列表的方式
2019/12/25 Python
计算机应用专业推荐信
2013/11/13 职场文书
党员批评与自我批评范文
2014/09/23 职场文书
运动会广播稿200字(10篇)
2014/10/12 职场文书
2015年六一儿童节演讲稿
2015/03/19 职场文书
毕业生捐书活动倡议书
2015/04/27 职场文书
摘录式读书笔记
2015/07/01 职场文书
2016幼儿园教师年度考核评语
2015/12/01 职场文书
2019年大学毕业生个人自我鉴定范文大全
2019/03/21 职场文书