2012-08-08 102 views
5

我有一個簡單的CakePHP應用程序,允許用戶創建和編輯帖子。而且我希望在未來某個時候將應用程序加入PhoneGap。使用CakePHP創建API

因此,我創建了一個API來吐出JSON用於AJAX請求,但是我感覺我做錯了,因爲我沒有使用REST或做任何與其他代碼不同的任何其他內容在控制器中。

例如(注:我缺少的部分大約將其轉換成JSON在這個例子中)

class ApiController extends AppController { 

    function index() { 
     $posts= $this->Post->find('all'); 
     $this->set(compact('posts')); 
    } 
} 

要創建像網址:domain.com/api/posts/all(將創建定製的路線來實現這一點),我可以調用使用AJAX使用在我的移動應用程序。

現在我的問題是使用REST做什麼不同?我非常喜歡構建應用程序,並且我的優勢在於前端而不是後端開發,所以任何指針,對此的幫助都將非常感謝。

+0

如果您在PhoneGab應用程序中使用Sencha Touch,還可以使用[Ext.Direct實現](http://banchaproject.org)而不是RESTful。 – 2013-05-19 15:50:11

回答

3

在CakePHP中啓用REST基本上將正確的HTTP方法路由到操作。因此,GET請求將被路由到索引或視圖操作,DELETE請求被路由到刪除操作等。

這爲使用您的API的人創建了一個非常簡單的端點。然後調用這個端點時,根據不同的HTTP方法將濾餅將其路由到適當的行動(原諒任何HTTP請求語法錯誤):

// single endpoint 
http://example.com/api/posts 

,GET請求路由/posts/index.json

GET /api/posts.json HTTP/1.1 
Host: example.com 

POST請求的路由到/posts/edit/1.json

POST /api/posts/1.json HTTP/1.1 
Host: example.com 
Content-Type: application/x-www-form-urlencoded; charset=utf-8 
Content-Length: 24 

data[Post][name]=updated 

讀這會回答你的大部分問題:http://book.cakephp.org/2.0/en/development/rest.html

+0

好吧,這是說...它不同於在控制器中創建標準方法而不使用REST?此外,這看起來可能是一個不同的問題,但DELETE方法通過POST或GET方法爲表單提供了什麼? – Cameron 2012-08-08 23:27:33

+0

首先,開發人員和您(創建文檔)更容易。更少的端點。其次,它會*要求*正確的HTTP方法。例如,用戶不再可以在他們的瀏覽器中訪問'/ api/posts/delete/1'並刪除一個帖子,他們實際上必須使用正確的方法請求DELETE。此外,Cake的REST系統將允許您接受不同的內容類型,並且可以在'$ this-> request-> data'中自動解碼它。如果它不適用於您,則無需執行此操作,但它是創建RESTful API的正確方法。 – jeremyharris 2012-08-08 23:35:47

3

如果您的疑慮是對真實的負責人。

然後,通常有4點要牢記:

  • 基本URI Web服務
  • 互聯網媒體類型由Web服務所支持的數據。
    這通常是JSON,XML或YAML,但可以是任何其他有效的Internet媒體類型。
  • Web服務使用HTTP方法 (例如GET,PUT,POST或DELETE)支持的一組操作。
  • 的API都必須超文本驅動

見,http://en.wikipedia.org/wiki/Representational_state_transfer瞭解更多詳情。

現在,有了這個說法,我建議改變你的上面的代碼,以接近下面的僞代碼。

1)資源的存在是關鍵,將您的帖子看作是可以通過URI訪問的資源集合。(認證授權&其他顧慮,你也可能要處理):

api.domain.com/resources/posts =>此URI指向帖子

2)集合的一組操作中你將要使用的HTTP方法以支持/動詞需要定義,作爲一個例子,我們可能想通過這樣做只獲得一個集合的成員:

api.domain.com/resources/posts/12

以下是請求標題&身體,可以在傳入中找到請求該URI:

接受:應用/ JSON
內容類型:應用程序/ JSON
請求URL:http://api.domain.com/resources/posts/12
請求方法:GET

你的應用程序應該能夠處理這種類型的請求,而不需要規定URI中的操作,使我們回到點(1),

而不是以這種方式寫的URI:

domain.com/api/posts/ 所有

你的URI應該是模型是這樣的:

資源/職位/ 12作爲資源/類型/項從集合中檢索一個成員,
資源/職位作爲資源/類型與整個集合一起工作。

這裏的代碼示例:

常見的抽象類 在這裏,你可以實現一些常見的任務。 如果您正在使用基於服務的實施 這也可以通過服務來完成。

abstract class ResourcesController extends AppController { 
} 


class PostResourcesController extends ResourcesController { 

    /** 
    * By the time this method is called in your controller/class, you already know 
    * that the HTTP method is GET. 
    * 
    * @param Request\$_GET $request A request instance 
    * @param int   $postId The post ID to retrieve 
    * 
    * @return Response A reponse instance 
    */ 
    function getPost(Request $Request, $postId = null) 
    { 
     /** 
     * Here you can use the request object to get 
     * the response content type  
     * the requesting client accepts. Example JSON or XML. 
     */ 

     /** 
     * using the $postId you can then query your database 
     * to retrieve a post with that ID or use a sort of 
     * service. 
     */ 

     /** 
     * Once you implemented a you logic 
     * you can build a response to return. 
     */ 
    } 
} 

此代碼是不完整的,但我希望它給你 的什麼是真正的RESTful的API可能看起來像的想法。

它確保
「應用程序可以通過了解兩件事情與資源進行交互的關鍵:資源的標識符和所需的操作」。

希望這有助於。