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 相关文章推荐
jquery的颜色选择插件实例代码
Oct 02 Javascript
js中关于String对象的replace使用详解
May 24 Javascript
js获取height和width的方法说明
Jan 06 Javascript
使用正则表达式的格式化与高亮显示json字符串
Dec 03 Javascript
jQuery实现背景滑动菜单
Dec 02 Javascript
网站申请不到支付宝接口、微信接口,免接口收款实现方式几种解决办法
Dec 14 Javascript
详解vue2.0脚手架的webpack 配置文件分析
May 27 Javascript
JavaScript实现重力下落与弹性效果的方法分析
Dec 20 Javascript
详解vue移动端日期选择组件
Feb 22 Javascript
使用canvas实现一个vue弹幕组件功能
Nov 30 Javascript
微信小程序webview实现长按点击识别二维码功能示例
Jan 24 Javascript
浅谈Vue3.0新版API之composition-api入坑指南
Apr 30 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下的PHP5.0安装配制详解
2006/09/05 PHP
PHP中上传大体积文件时需要的设置
2006/10/09 PHP
利用PHP生成静态HTML文档的原理
2012/10/29 PHP
如何修改yii2.0自带的user表为其它的表
2017/08/01 PHP
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
jquery遍历input取得input的name
2009/04/27 Javascript
利用函数的惰性载入提高javascript代码执行效率
2014/05/05 Javascript
jquery让返回的内容显示在特定div里(代码少而精悍)
2014/06/23 Javascript
通用无限极下拉菜单的实现代码
2016/05/31 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
Dropzone.js实现文件拖拽上传功能(附源码下载)
2016/11/22 Javascript
Vue2单一事件管理组件通信
2017/05/09 Javascript
详解给Vue2路由导航钩子和axios拦截器做个封装
2018/04/10 Javascript
JavaScript引用类型Object常见用法实例分析
2018/08/08 Javascript
解决vue props 拿不到值的问题
2018/09/11 Javascript
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
JavaScript使用类似break机制中断forEach循环的方法
2018/11/13 Javascript
前后端常见的几种鉴权方式(小结)
2019/08/04 Javascript
Vue.js的模板语法详解
2020/02/16 Javascript
vant 解决tab切换插件标题样式自定义的问题
2020/11/13 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
2021/02/18 Vue.js
python实现FTP服务器服务的方法
2017/04/11 Python
selenium+python自动化测试之鼠标和键盘事件
2019/01/23 Python
python反编译学习之字节码详解
2019/05/19 Python
Python远程方法调用实现过程解析
2020/07/28 Python
Python3如何使用tabulate打印数据
2020/09/25 Python
什么是数组名
2012/05/10 面试题
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
2016/10/17 面试题
职工运动会邀请函
2014/02/02 职场文书
财务会计自荐信范文
2014/02/21 职场文书
文明礼仪标语
2014/06/13 职场文书
团日活动总结怎么写
2014/06/25 职场文书
党员干部四风问题整改措施思想汇报
2014/10/12 职场文书
廉政承诺书范文
2015/04/28 职场文书
音乐之声观后感
2015/06/04 职场文书
农村房屋租赁合同(范本)
2019/07/23 职场文书