问题描述

怎么POST过去给PHP都收不到资料?

$_POST方法取不到正确的传入值!

原理说明

AngularJS这套framework使用的AJAX方法中,资料传递的格式为JSON,送出去的header

Content-Type: application/json

而非JQuery 或是HTML form 送出的

multipart/form-data

application/x-www-form-urlencoded

解决办法

  1. AngularJS 配合,去把请求的header 改成PHP 能够接受的

  2. PHP 配合,改成接受JSON 格式的请求

我个人比较倾向解决办法2(以JSON沟通为主),JSON格式在前后端的沟通上有着很好的弹性,前端包装,​​后端收到资料轻松的拆解。

先说办法1 的解法,首先要把预设值改掉

//替换成自己的模组名称后使用config设定header
angular.module("YourAppModule", ["SomeModule"]).config(function($httpProvider) {
$httpProvider.defaults.headers.put['Content-Type'] =
'application/x-www-form-urlencoded';
$httpProvider.defaults.headers.post['Content-Type'] =
'application/x-www-form-urlencoded';
});

如上解法

但是这样只会让POST方法中,传资料的栏位,变成一次送出1团,而且是无属性栏位只有的一团!(就是JSON字串)

所以要

用AngularJS 的方法自己写一个中间层(interceptor)来打包请求/回应

$httpProvider.interceptors.push(['$q', function($q) {
return {
request: function(config) {
if (config.data && typeof config.data === 'object') {
//请求在这边做处理,下方针对请求的资料打包
config.data = serialize(config.data);
//serialize 序列化的程式码可以参考下方
}
return config || $q.when(config);
}
};
}]);

ref: 参考 <<推荐一读

var serialize = function(obj, prefix) {
var str = [];
for(var p in obj) {
var k = prefix ? prefix + "[" + p + "]" : p, v = obj[p];
str.push(typeof v == "object" ? serialize(v, k) : encodeURIComponent(k) + "=" + encodeURIComponent(v));
}
return str.join("&");
}

ref: 参考

如此一来,PHP 在后端的部分可以完全不用修改,就接上啰!

虽然有点多此一举,但是从这可以知道,AngularJS 有interceptor 可以来包装请求/回应这件事的设计其实还满不错的说~

针对无登入或任何伺服器回应事件,前端网页需要做跳转还是其他处理时有个中控管理的机制,减少在其他方法的判断与code 的维护

接下来是办法2

不改动到前端,对后端PHP做一点修改

$content_type_args = explode(';', $_SERVER['CONTENT_TYPE']);
if ($content_type_args[0] == 'application/json')
$_POST = json_decode(file_get_contents('php://input'),true);

ref: 参考

在使用$_POST方法前或档案开头处,补上这三行就OK,与以往开发无两样!

原理就是把前端传过来的JSON 做parsing 配给$_POST ,搞定

此文转载!

最新文章

  1. 111. for(元素变量x:遍历对象obj)
  2. make命令以及makefile
  3. Core Java Volume I — 3.5. Operators
  4. 弹出框layer的使用封装
  5. Unity Get Thread Content Failed
  6. 【linux之简介】
  7. posix,perl正则表达式区别
  8. solr 入门
  9. Java - Java入门(2-1am)
  10. 【Oracle 11gR2】静默安装 db_install.rsp文件详解
  11. V4L2 API详解 &lt;二&gt; Camera详细设置【转】
  12. 【HDU5730】 Shell Necklace
  13. day 71 crm(8) 权限组件的设置,以及权限组件的应用
  14. SIMULINK的模块库介绍
  15. 安装office2010出现了错误,提示要安装MSXML6.10.1129.0解决方法
  16. JVM 发生OOM的四种情况
  17. module.exports和exports
  18. python正则表达式03--字符串中匹配数字
  19. ES5与ES6的继承
  20. redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect time out

热门文章

  1. 使用代码向一个普通的类注入Spring的实例
  2. 基于WebGL 的3D呈现A* Search Algorithm
  3. 从三栏自适应宽度布局到css布局的讨论
  4. 学习javascript数据结构(三)——集合
  5. 【WP8.1】WebView笔记
  6. Android 5.0源码编译问题
  7. django+mysql学习笔记
  8. java类的初始化顺序
  9. java变量类型
  10. Quartz —— 从 HelloWorld 开始