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 相关文章推荐
javascript 获取元素位置的快速方法 getBoundingClientRect()
Nov 26 Javascript
解决jquery的datepicker的本地化以及Today问题
May 23 Javascript
jquery实现textarea输入字符控制(仿微博输入控制字符)
Apr 26 Javascript
js写的评论分页(还不错)
Dec 23 Javascript
JS完整获取IE浏览器信息包括类型、版本、语言等等
May 22 Javascript
Java中Timer的用法详解
Oct 21 Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
Apr 30 Javascript
浅谈JavaScript 浏览器对象
Jun 03 Javascript
js生成随机数方法和实例
Jan 17 Javascript
jQuery中table数据的值拷贝和拆分
Mar 19 Javascript
JavaScript实现仿Clock ISO时钟
Jun 29 Javascript
用JS实现选项卡
Mar 23 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序列号生成函数和字符串替换函数代码
2012/06/07 PHP
php $_SERVER windows系统与linux系统下的区别说明
2014/02/14 PHP
laravel实现上传图片的两种方式小结
2019/10/12 PHP
PHP如何使用array_unshift()在数组开头插入元素
2020/09/01 PHP
js字符串转成JSON
2013/11/07 Javascript
javascript数组操作总结和属性、方法介绍
2014/04/05 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
2015/01/05 Javascript
浅谈Javascript中的Function与Object
2015/01/26 Javascript
跟我学习javascript的call(),apply(),bind()与回调
2015/11/16 Javascript
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
BootStrap入门学习第一篇
2017/08/28 Javascript
JavaScript程序设计高级算法之动态规划实例分析
2017/11/24 Javascript
webpack热模块替换(HMR)/热更新的方法
2018/04/05 Javascript
Vue根据条件添加click事件的方式
2019/11/09 Javascript
JavaScript实现移动端带transition动画的轮播效果
2020/03/24 Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
2020/05/21 Javascript
Python实例之wxpython中Frame使用方法
2014/06/09 Python
python查看zip包中文件及大小的方法
2015/07/09 Python
Python爬虫模拟登录带验证码网站
2016/01/22 Python
tensorflow实现对图片的读取的示例代码
2018/02/12 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
2019/09/07 Python
pytest中文文档之编写断言
2019/09/12 Python
Python利用PyExecJS库执行JS函数的案例分析
2019/12/18 Python
python读取与处理netcdf数据方式
2020/02/14 Python
Python实现简单猜数字游戏
2021/02/03 Python
伦敦一家非常流行的时尚精品店:Oxygen Boutique
2017/01/15 全球购物
EMU Australia澳大利亚官网:澳大利亚本土雪地靴品牌
2019/07/24 全球购物
2014年师德师风学习材料
2014/05/16 职场文书
助人为乐道德模范事迹材料
2014/08/16 职场文书
家属答谢词
2015/01/05 职场文书
培训通知书模板
2015/04/17 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
2016年“我们的节日·清明节”活动总结
2016/04/01 职场文书
《战锤40K:暗潮》跳票至9月 公布新宣传片
2022/04/03 其他游戏
mybatis-plus模糊查询指定字段
2022/04/28 Java/Android
python manim实现排序算法动画示例
2022/08/14 Python