AngularJS $ resource save()导致HTTP错误415(不支持的媒体类型)

时间:2013-10-08 06:08:33

标签: angularjs spring-mvc angular-resource

我正在使用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 docs,应该可以覆盖标题,但我的设置会被忽略。我认为这是一个常见的问题,作为workaround,有许多建议使用$ http.post而不是$ resource。

您能否给我提示如何使用$ resource服务解决此内容类型问题?

请查找后端控制器代码here

2 个答案:

答案 0 :(得分:2)

首先,您要覆盖内置的$save方法,因此您可以省略save:部分(请参阅source code)。如果您确实定义了非内置的其他HTTP方法,则可以像这样更新$httpProvider(这是添加patch方法):

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

答案 1 :(得分:0)

凯文斯通推动我走向正确的方向。谢谢!

由于query()返回一个数组,而save()意味着只保存该数组中的一个项目,同时我必须重新实现save()内容differently

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

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