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中[]和{}对象使用介绍
Mar 20 Javascript
JS小功能(setInterval实现图片效果显示时间)实例代码
Nov 28 Javascript
浅析JavaScript事件和方法
Feb 28 Javascript
JavaScript中数组的合并以及排序实现示例
Oct 24 Javascript
js调出上下文菜单的实例
Dec 17 Javascript
weUI应用之JS常用信息提示弹层的封装
Nov 21 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
Sep 12 jQuery
React如何解决fetch跨域请求时session失效问题
Nov 02 Javascript
微信小程序云开发 搭建一个管理小程序
May 17 Javascript
javascript function(函数类型)使用与注意事项小结
Jun 10 Javascript
详解Vue后台管理系统开发日常总结(组件PageHeader)
Nov 01 Javascript
详解JavaScript中的执行上下文及调用堆栈
Apr 29 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
浅谈Windows下 PHP4.0与oracle 8的连接设置
2006/10/09 PHP
PHP模拟QQ登录的方法
2015/07/29 PHP
php多线程实现方法及用法实例详解
2015/10/26 PHP
深入理解PHP之OpCode原理详解
2016/06/01 PHP
PHP 中使用ajax时一些常见错误总结整理
2017/02/27 PHP
JS操作XML中DTD介绍及使用方法分析
2019/07/04 PHP
Laravel基础_关于view共享数据的示例讲解
2019/10/14 PHP
JS控制图片等比例缩放的示例代码
2013/12/24 Javascript
JS操作iframe里的dom(实例讲解)
2014/01/29 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
2015/11/22 Javascript
原生js编写基于面向对象的分页组件
2016/12/05 Javascript
详解webpack异步加载业务模块
2017/06/23 Javascript
bootstrap switch开关组件使用方法详解
2017/08/22 Javascript
深入理解ES6之数据解构的用法
2018/01/13 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
2019/01/29 Javascript
微信小程序开发实现消息推送
2020/11/18 Javascript
基于JS实现简单滑块拼图游戏
2019/10/12 Javascript
详解配置Django的Celery异步之路踩坑
2018/11/25 Python
Django Rest framework权限的详细用法
2019/07/25 Python
Python 线程池用法简单示例
2019/10/02 Python
利用python中的matplotlib打印混淆矩阵实例
2020/06/16 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
2020/08/07 Python
python 进制转换 int、bin、oct、hex的原理
2021/01/13 Python
世界上最好的威士忌和烈性酒购买网站:The Whisky Exchange
2016/11/20 全球购物
naturalizer加拿大官网:美国娜然女鞋
2017/04/04 全球购物
香港礼品网站:GiftU eshop
2017/09/01 全球购物
Final类有什么特点
2012/04/25 面试题
甜点店创业计划书
2014/01/27 职场文书
中学生期末评语
2014/02/03 职场文书
小学教师培训感言
2014/02/11 职场文书
中学清明节活动总结
2014/07/04 职场文书
2014保险公司个人工作总结
2014/12/09 职场文书
学生保证书格式
2015/02/27 职场文书
七年级之家长会发言稿范文
2019/09/04 职场文书
SpringBoot+Redis实现布隆过滤器的示例代码
2022/03/17 Java/Android
python套接字socket通信
2022/04/01 Python