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'
            }
        }
    });
});

每当调用 Settings 类的 save() 方法时,前端都会收到 HTTP 415(不支持的媒体类型)。原因是 AngularJS 使用以下内容类型发送 POST 请求:

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

但后端期望

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

根据API 文档,应该可以覆盖标头,但我的设置以某种方式被忽略了。我似乎这是一个常见问题,作为一种解决方法,有很多建议使用 $http.post 而不是 $resource。

你能给我任何提示如何使用 $resource 服务解决这个内容类型问题吗?

请在此处找到后端控制器代码。

4

2 回答 2

2

首先,您覆盖了一个内置$save方法,因此您可以省略该save:部分(参见源代码)。如果您确实定义了未内置的其他 HTTP 方法,则可以更新$httpProvider类似的方法(这是添加patch方法):

.config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.headers.patch = {
         'Content-Type': 'application/json;charset=utf-8'
    }
}]);
于 2013-10-08T07:45:59.917 回答
0

凯文斯通把我推向了正确的方向。谢谢!

由于 query() 返回一个数组,而 save() 意味着同时只保存该数组的一项,我不得不以不同的方式重新实现 save() 的东西。

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

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

于 2013-10-08T15:13:41.550 回答