$ resource服务的Angular自定义POST操作返回404

时间:2015-08-05 21:12:12

标签: angularjs post resources

当我从自定义POST操作发出POST请求时,我正在使用angular $ resource服务并遇到一种奇怪的情况。删除newDb变量(见下文)确实发布了Web API的帖子,但数据作为null传递给Web API。

这是我的Web API控制器:

var azMongo = angular.module('azMongo', ['services', 'ngResource']);

// ------------------- controllers ------------------------------ \\
azMongo
.controller('ListCtrl', ['$scope', 'dbFactory', 
    function ($scope, dbFactory) {

        $scope.id = '2';
        $scope.newDbName = 'new name';

        dbFactory.getDb({ id: $scope.id }).$promise.then(function(db) {$scope.db = db;});

        dbFactory.getDBs().$promise.then(function (dbs) { $scope.dbs = dbs;});

        $scope.addDb = function () {                       
            var newDb = new dbFactory({ id: 4, name: $scope.newDbName });

            dbFactory.saveDb(newDb, function (response) {                
                alert(JSON.stringify(response));
            },
            function(error) {
                alert(JSON.stringify(error));                
            });             
        };
    }
]);

// ------------------- factories ------------------------------ \\
var services = angular.module('services', ['ngResource']);
services
.factory('dbFactory', ['$resource', 
    function ($resource) {        
        return $resource(
            'http://localhost:62820/api/mongodb/:id',            
            {},                                        
            {
                getDBs: { method: 'GET', isArray: true },
                getDb: { method: 'GET' },
                saveDb: {
                    method: 'POST',
                    url: 'http://localhost:62820/api/mongodb',
                    params: {},
                    headers: { 'Content-Type': 'application/json; charset=UTF-8' }
                },
                updateDb: {method: 'PUT', url: 'http://localhost:62820/api/mongodb'}
            }
        );        
    }
]);

以下是角度控制器和工厂:

dbFactory.saveDb(function (response) {...}

正如我所提到的,行:

dbFactory.saveDb(newDb, function (response) {...}

确实有效,但没有将日期传递给Web API,并试图像这样传递它:

{
   "data":"",
   "status":404,
   "config":{
      "transformRequest":[
         null
      ],
      "transformResponse":[
         null
      ],
      "method":"POST",
      "url":"http://localhost:62820/api/mongodb",
      "headers":{
         "Content-Type":"application/json; charset=UTF-8",
         "Accept":"application/json, text/plain, */*"
      },
      "data":{
         "id":4,
         "name":"new name"
      }
   }
}

从错误函数中得到以下结果:

{"Message":"The requested resource does not support http method 'OPTIONS'."}

Fiddler拦截电话并报告{{1}},并将内容类型显示为text / html。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

我花了几天的时间把头靠在我的桌子上,直到找到解决办法。只需向控制器添加另一种方法:

        [AcceptVerbs("OPTIONS")]
        public HttpResponseMessage Options()
        {
            return new HttpResponseMessage(HttpStatusCode.OK);            
        }

因此请求首先进入Options方法,因为它返回OK,之后会调用正确的PUT或POST方法。

我希望这篇文章可以帮助有同样问题的人。