Angular 发送帖子正文(数据),application/json
而表单通常发送为application/x-www-form-urlencoded
. Pyramid 解析主体并让您在request.POST
将其编码为正常形式时访问它。
不可能将每个以 Angular 方式 (json) 编码的数据表示为金字塔 API 提供的键/值对。
[
1,
2,
3,
4
]
金字塔侧的解决方案
它可以按视图或全局解决
每次观看
这是金字塔方式,也是最灵活的处理方式。
@view_config(renderer='json')
def myview(request):
data = request.json_body
# deal with data.
return {
"success" : True
}
全球范围内
Pyramid 很可能被设置为假定一个编码为application/json
对象的主体,其属性放在 request.POST 中。
Angular 方面的解决方案
与金字塔侧一样,它可以根据请求和全局解决。
根据请求
您需要以通常发送表单的方式发送数据:
$http({
method: 'POST',
url: url,
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
transformRequest: function(obj) {
var str = [];
for(var p in obj) {
if (obj.hasOwnProperty(p)) {
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
}
}
return str.join("&");
},
data: xsrf
}).success(function () {});
全球范围内
要默认以表单形式发送帖子,请配置 $httpProvider 以执行此操作。
angular.module('httpPostAsForm', [])
.config(['$httpProvider', function ($httpProvider) {
$httpProvider.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded";
$httpProvider.defaults.transformRequest.unshift(function (obj) {
var str = [];
for(var p in obj) {
if (obj.hasOwnProperty(p)) {
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
}
}
return str.join("&");
});
}]);
然后在你的应用中包含这个模块:
angular.module("app", ["httpPostAsForm"]);