2013-10-08 101 views
0

我正在使用Angular 1.2-RC2(也试过1.0.8和1.1.x)和ngResource模块。后端是一个Spring WebMVC应用程序。

angular.module("dox", ['ngResource']) 

.controller('SettingsController', function ($scope, Settings) { 
    $scope.settings = Settings.query(); 

    $scope.save = function() { 
     Settings.save(); 
    }; 
}) 

.factory('Settings', function ($resource) { 
    return $resource('/api/v1/settings/:settingId', {settingId: '@id'}, { 
     'save': { 
      method: 'POST', 
      headers: { 
       'Content-Type': 'application/json' 
      } 
     } 
    }); 
}); 

每当上设置类的save()方法被调用前端接收HTTP 415(不支持的媒体类型)。其原因是,AngularJS使用以下内容类型发送POST请求:

Content type: text/plain;charset=UTF-8 

,但后端预计

Content type: application/json;charset=UTF-8 

根据API docs,应该可以覆盖头,但我的设置在某种程度上忽略。我认为这是一个常见问题,并且作为workaround有许多建议使用$ http.post而不是$ resource。

你可以给我任何提示如何使用$资源服务解决这个内容类型问题?

请查看后台控制器代码here

回答

0

凯文·斯通把我推到正确的方向。谢谢!由于query()返回一个数组,并且save()意味着只保存该数组的一个项目,所以我不得不重新实现save()的东西differently

$scope.save = function() {  
    angular.forEach($scope.settings, function (value, key) {      
     value.$save(); 
    }); 
}; 

完成!再次感谢您的提示和帮助

+0

任何你没有使用实例方法并在'forEach'循环内调用'value。$ save()'而不是类级'Settings.save()'的原因?我认为如果将这些资源实例视为对象而不是数据容器,它将帮助您避免这些问题。 –

+0

好的。会改变这一点 – saw303

2

首先,您将覆盖内置的$save方法,因此您可以省略​​部分(请参阅source code)。如果你定义了没有内置额外的HTTP方法,您可以更新$httpProvider像这样(这是添加patch法):

.config(['$httpProvider', function($httpProvider) { 
    $httpProvider.defaults.headers.patch = { 
     'Content-Type': 'application/json;charset=utf-8' 
    } 
}]); 
+0

谢谢您的回答。我重写save方法的原因是当我使用标准配置(它看起来正确并且是我想要的)时,也以text/plain而不是application/json的形式发送请求。由于Settings是一个数组(由query()检索),或者AngularJS为什么决定使用text/plain,所以在数组上调用save是个问题吗? – saw303

相关问题