2013-04-13 44 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

完美,謝謝!) –