AngularJS - PUT方法不起作用(404错误)

时间:2013-07-15 08:49:44

标签: rest angularjs put slim

我是AngularJS的新手,我无法通过REST更新对象。我正在使用PHP / Mysql后端(Slim Framework) 我能够检索(GET),创建(POST)一个新对象但不能编辑(PUT)一个。这是代码:

我的表格:

<form name="actionForm" novalidate ng-submit="submitAction();">
  Name: <input type="text" ng-model="action.name" name="name" required>
  <input type="submit">
</form>

我的服务:

var AppServices = angular.module('AppServices', ['ngResource'])
AppServices.factory('appFactory', function($resource) {
  return $resource('/api/main/actions/:actionid', {}, {
    'update': { method: 'PUT'},
  });
});

app.js

var app = angular.module('app', ['AppServices'])
app.config(function($routeProvider) {
  $routeProvider.when('/main/actions', {
    templateUrl: 'partials/main.html',
    controller: 'ActionListCtrl'
  });
  $routeProvider.when('/main/actions/:actionid', {
    templateUrl: 'partials/main.html',
    controller: 'ActionDetailCtrl'
  });
  $routeProvider.otherwise({redirectTo: '/main/actions'});
});

controllers.js:

function ActionDetailCtrl($scope, $routeParams, appFactory, $location) {
  $scope.action = appFactory.get({actionid: $routeParams.actionid});
  $scope.addAction = function() {
    $location.path("/main/actions/new");
  }
  $scope.submitAction = function() {
    // UPDATE CASE
    if ($scope.action.actionid > 0) {
      $scope.action = appFactory.update($scope.action);
      alert('Action "' + $scope.action.title + '" updated');
    } else {
      // CREATE CASE
      $scope.action = appFactory.save($scope.action);
      alert('Action "' + $scope.action.title + '" created');
    }
    $location.path("/main/actions");
  }
}

在Slim中,在api / index.php中,我已经定义了这些路由和函数:

$app->get('/main/actions', 'getActions');
$app->get('/main/actions/:actionid',    'getAction');
$app->post('/main/actions', 'addAction');
$app->put('/main/actions/:actionid', 'updateAction');

当我创建一个新的“动作”时,一切都按预期工作。但是当我尝试编辑现有版本时,我遇到了这个错误:

  

PUT http://project.local/api/main/actions 404 Not Found

操作未更新(尽管显示警告消息“Action xxx updated”)

我的routeProvider设置是否存在问题?我猜PUT url最后错过了id ...

我确切地说,如果我尝试用POSTMan-Chrome-Extension来模拟PUT请求,那么一切都运行良好(PUT http://project.local/api/main/actions/3返回预期的数据)

1 个答案:

答案 0 :(得分:4)

在仔细阅读之后,问题确实是您在执行更新请求时不会在URL中发送id。此外,您调用更新/保存的方式与资源不同。创建资源后,可以在实例上调用save / update方法,而不是工厂函数。您还可以将实例的属性绑定到url中的params,因此您不必在每次调用时指定它们:

AppServices.factory('appFactory', function($resource) {
  return $resource('/api/main/actions/:actionid', {actionid : '@actionid'}, {
    'update': { method: 'PUT'},
});

资源的第二个参数告诉angular它应该使用哪些属性来填充url参数。 所以get操作保持不变:

$scope.action = appFactory.get({actionid: $routeParams.actionid});

现在更新:

$scope.submitAction = function() {
  // UPDATE CASE
  if ($scope.action.actionid > 0) {
    $scope.action.$update()
  } else {
    $scope.action.$save();  
  }
}

由于你使用棱角窖作为基础,我应该检查一下,看看能否改善这个...