金字塔不适用于角$ http帖子

时间:2013-07-22 05:46:46

标签: angularjs pyramid cornice

$http({method: 'POST', url: 'http://localhost:5001/products', data: {token: $scope.product.token}}).success(
    function () {
        alert('success');
    }
);

在金字塔方面,request.POST显示NOVars:不是表单请求。不是HTML表单提交(Content-Type:application / json)

我使用檐口提供我的api(/ products),我认为这是金字塔问题。

有没有人有解决方案?

6 个答案:

答案 0 :(得分:4)

Angular将帖子正文(数据)发送为application/json,而表单通常以application/x-www-form-urlencoded形式发送。金字塔会解析正文,当您将其编码为普通表单时,可以在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
    }

全球

金字塔很可能被设置为假设编码为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"]);

答案 1 :(得分:2)

AngularJS $ http.post与jquery不同。您传递的数据不会作为表单发布,而是作为请求正文中的json发布。因此,您的金字塔视图无法像往常一样对其进行解码。你必须要么:

  • 直接访问请求正文并在金字塔视图中对其进行解码;
  • 或修改您的angularjs代码以将您的数据发布为表单内容:请参阅this other question in stackoverflow

答案 2 :(得分:1)

答案是角度$ post首先执行OPTIONS请求,然后执行POST请求,从request.json_body获取数据

答案 3 :(得分:1)

如果发布一些json解码的内容,请使用req.json_bodyreq.GETreq.POSTreq.params仅应对提交内容。顺便说一句,$ http - > ngResource - > restangular ...

答案 4 :(得分:0)

尝试在$ http中设置内容类型,如下所示。

 $http(
           {
               url: url,
               contentType: "application/json",
               data: data,
               method: method
           })
           .success(function (response) {
               successcb(response);
           }).error(function (data, status, headers, config) { errorcb(data); });
  };

答案 5 :(得分:0)

您只需以这种方式获取POST数据:

query = json.loads(request.body)