我正在使用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。
答案 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();
});
};
完成!再次感谢您的提示和帮助