2014-12-18 110 views
1

我正在嘗試爲我的Zend 2網站創建一個休息api,並且我對路由,它背後的一些邏輯以及在哪裏使用控制器感到困惑。Zend 2的Restful API

比方說,我希望得到一個用戶:http://example.com/api/user/peter

這將去ApiController,尋找userAction功能,在那裏我能得到帕拉姆「彼得」和返回的一些細節。

問題是區分方法(post,get,put ...)在userAction函數中嗎?或者我的ApiController應該包含getAction()postAction()...函數?

如果是後者我怎麼能區分這些網址:

http://example.com/api/user/peter 
http://example.com/api/house 
http://example.com/api/animal/cat 
+0

參見[這裏](http://www.restapitutorial.com/lessons/httpmethods.html)以及[這裏](http://www.restapitutorial.com/lessons/restquicktips.html)。整個網站,真的。 –

+1

如果您在ZF2中編寫REST API,請考慮Zend編寫的[Apigility](https://apigility.org/)。 – AlexP

回答

1

它的東西是經常討論。你所說的兩件事情都是完全有效的,但有不同的實施方式,優點和缺點。

實現1

使用HTTP方法(POST,GET,PUT ...)你userAction功能區分什麼事情你想(創建,讀取,更新中...)。

例如http://example.com/api/user/peter

function userAction() 
{ 
    $method = $this->getRequest()->getMethod(); 

    switch ($method) 
    { 
     case 'POST': 
      // Create peter user 
     break; 
     case 'GET': 
      // Read peter user 
     break; 
     case 'PUT': 
      // Update peter user 
     break; 
     case 'DELETE': 
      // Delete peter user 
     break; 
    } 
} 

實現2

使用Zend公司型動物在你apiController行動(postAction()的getAction()...)來確定的,如果你想創建,閱讀,更新...用戶。在這種情況下,您需要在Method的API中確定您想要執行的操作。

我建議使用「api」作爲MODULE和「user」作爲CONTROLLER,它將更具可擴展性。例如:

獲得由一組名稱

URL: http://example.com/api/user/peter 
MODULE: api 
CONTROLLER: user 
ACTION: index 
PARAM: peter 

。在這種情況下確定的用戶也可能是combinate更多的GET參數,可以像網頁或每頁:

URL: http://example.com/api/user/peter?page=1&pagesize=25 
MODULE: api 
CONTROLLER: user 
ACTION: index 
PARAM: peter,page,pagesize 

刪除一個給定的用戶

URL: http://example.com/api/user/peter/delete 
MODULE: api 
CONTROLLER: user 
ACTION: delete 
PARAM: peter 

編輯給定用戶

URL: http://example.com/api/user/peter/edit 
MODULE: api 
CONTROLLER: user 
ACTION: edit 
PARAM: peter 

我們使用刪除或編輯URL中的詞來確定我們想要執行的操作。這是需要定義正確的路線和區分網址。


總之我更喜歡使用實現2. API的方法更容易理解和乾淨,你的代碼不會變得更復雜。

如果你想在其他API實現挖知道他們是如何做到這一點,我建議你看看Stack Exchange API

2

Apigility API建設者真正簡化優良品質的RESTful API,包括直觀的URL結構的創建。要直接回答你的問題,雖然,你可以使用控制器動作訪問HTTP方法:

$this->getRequest()->getMethod()