问题描述
我是这样提交表单的
$http({ headers: {’Content-Type’: ’application/x-www-form-urlencoded’ }, method: ’POST’, url: url, data: {type: 1 }})
为什么我的服务器接到的会是这样的东西?
{ ’{'type':1}’: ’’ }
问题解答
回答1:问题解决了原因:By default, jQuery transmits data using Content-Type: x-www-form-urlencoded and the familiar foo=bar&baz=moe serialization. AngularJS, however, transmits data using Content-Type: application/json and { 'foo': 'bar', 'baz': 'moe' } JSON serialization
默认情况下,jQuery传输数据使用Content-Type: x-www-form-urlencodedand和类似于'foo=bar&baz=moe'的序列,然而AngularJS,传输数据使用Content-Type: application/json和{ 'foo': 'bar', 'baz': 'moe' }这样的json序列。
解决方法
.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’; // Override $http service’s default transformRequest $httpProvider.defaults.transformRequest = [function(data) {/** * The workhorse; converts an object to x-www-form-urlencoded serialization. * @param {Object} obj * @return {String} */var param = function(obj) { var query = ’’; var 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;};return angular.isObject(data) && String(data) !== ’[object File]’? param(data): data; }];})回答2:
可能是你jquery用习惯了,jquery封装了query_string操作你在angular加上这段代码就好了,改下示例名称
APP.config([’$httpProvider’,function($httpProvider) { $httpProvider.defaults.headers.post[’Content-Type’] = ’application/x-www-form-urlencoded’; // Override $http service’s default transformRequest $httpProvider.defaults.transformRequest = [function(data) {/** * The workhorse; converts an object to x-www-form-urlencoded serialization. * @param {Object} obj * @return {String} */var param = function(obj) { var query = ’’; var 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;};return angular.isObject(data) && String(data) !== ’[object File]’? param(data): data; }];}]);回答3:
1、看angularjs的官方文档了解其用法,貌似$http的header有点不同。2、下载fiddler工具,查看请求header和params等信息。
回答4:服务端不能直接用 $_REQUEST/$_POST获取到,而需要用:$params = json_decode(file_get_contents(’php://input’),true);
来获取提交数据