【问题标题】:AngularJS $resource save() causes HTTP Error 415 (Unsupported Media Type)AngularJS $resource save() 导致 HTTP 错误 415(不支持的媒体类型)
【发布时间】:2013-10-14 22:32:54
【问题描述】:

我正在使用 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。

【问题讨论】:

    标签: angularjs spring-mvc angular-resource


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。我重写 save 方法的原因是,当我使用标准配置(看起来正确并且是我想要的)时,也会将请求作为 text/plain 而不是 application/json 发送。由于 Settings 是一个数组(由 query() 检索),因此在数组上调用 save 是否有问题,或者为什么 AngularJS 决定使用 text/plain?
    【解决方案2】:

    Kevin Stone 把我推向了正确的方向。谢谢!

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

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

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

    【讨论】:

    • 有什么理由不使用实例方法并在forEach 循环中调用value.$save() 而不是类级别的Settings.save()?我认为如果您将这些资源实例视为对象而不仅仅是数据容器,这将有助于您避免这些问题。
    • 好收获。会改变的
    猜你喜欢
    • 2014-10-02
    • 2014-06-21
    • 1970-01-01
    • 2017-07-05
    • 2015-08-29
    • 2018-10-13
    • 2018-07-25
    • 2016-09-09
    相关资源
    最近更新 更多