2013-04-13 24 views
2

我的REST API配置为接受这种要求补丁请求发送到错误的URL

public function lockUserAction($slug) 
{} // "lock_user"  [PATCH] /users/{slug}/lock 

所以发送补丁请求

/api/users/2/lock 

将锁定与用户ID = 2。这是我的休息服务angular.js

angular.module('UserService',['ngResource']).factory('User', function($resource){ 
    var User = $resource('/api/users/:id', 
     {}, 
     { 
      list: { method: 'GET' }, 
      lock: { method: 'PATCH' } 
     } 
    ); 
    return User; 
}); 

列表工作只是finde,但锁定不起作用。控制台打印:

PATCH /api/users 405 (Method Not Allowed) 

我调用它像这样

$scope.lock = function(user){ 
    user.$lock(); 
} 

在错误消息我看到了网址/api/users而不是/api/users/2/lock。这是正常的行为吗?当然,除了仅在/api/users上仅允许/api/users/{slug}/lock的GET请求和PATCH请求之外,列表除外。

任何想法为什么/ api/users被调用,而不是/ api/users/{slug}/lock。任何想法如何解决这一问题?

+0

补丁?你正在编写自己的HTTP动词?这很好,但看看你的服务器端发生了什么。由于某些原因,这些请求会返回405错误。确保传入的URL有一个ID参数。 – jpsimons

+1

@darkporter http://tools.ietf.org/html/rfc5789 – jusio

+1

@darkporter我不做自己的HTTP动词。我在使用PATCH的后端使用FOSRestBundle。是的,但似乎调用了错误的URL。 –

回答

4

当您拨打$lock时,angular并不知道您打算使用一些额外的路径元素调用与之前相同的url。也没有办法让角度知道什么是:id param的值。

不是让角度了解锁定:

var User = $resource('/api/users/:id/:action', //add param to the url 
     {}, 
     { 
      list: { method: 'GET' }, 
      lock: { method: 'PATCH',params:{action:"lock",id:"@id"}} //set param value, so angular knows where to send request, @id refers to user id in json representation of user 
     } 
    ); 
+1

在编辑部分工作之前回答,它缺少动作参数在被调用的url中(/ api/users/2 405(Method Not Allowed))。你目前的答案和我的问题一样。我再次得到/ api/users 405(方法不允许) –

+0

对不起,我有一个错字,而不是参数应该有一个参数键,我已经尝试了代码,它应该工作。唯一的问题可能是'@id'值,因为我不确定您的用户项目中的属性名称是什么 – jusio

+1

完美,谢谢!) –