2014-01-08 71 views
5

在水果一個RESTful API,請求假設是這樣的:是否有相應的寧靜PHP功能的標準?

api/fruit 
api/fruit?limit=100 
api/fruit/1 
api/fruit?color=red 

我認爲必須有該做的工作功能的標準。例如,有些東西可能很容易翻譯爲fruit.class.php

fruit.class.php

function get ($id, $params, $limit) { 
    // query, etc. 
} 

所以我上面的例子中,代碼看起來像

  • api/fruit

    $fruit = $oFruit->get(); 
    
  • api/fruit?limit=100

    $fruit = $oFruit->get(NULL, NULL, 100); 
    
  • api/fruit/1

    $fruit = $oFruit->get(1); 
    
  • api/fruit?color=red

    $fruit = $oFruit->get(NULL, array('color' => 'red')); 
    

是否有這樣的一個行業標準或者是API /數據庫函數總是亂七八糟的?我真的想要標準化我的功能。

+0

通常您可以訪問這些方法中的HTTP請求對象,並傳遞slug變量標記[例如'/ fruit /:id']作爲方法參數。 – moonwave99

+0

我不認爲有一個普遍接受的標準。大多數請求處理由用於傳遞數據的包決定。如果您使用框架,您可能會遵守該框架的標準。如果專有,我想這取決於您的偏好。如果我想說有一個標準,那就是考慮OOP,MVC並使其可讀。記下它。 –

+0

對。這就是我想的,但我最終得到了兩個結果之一:一堆模型函數,如getById,getByName,getByDate等等,或者我最終得到一個更長的包容函數,如get($ id,$ params,$限制)其中$ params是一個搜索參數數組,我的函數將其排序。我希望有人能夠以某種理由給出明確的答案,說明爲什麼一個結果可能比另一個更好處理。 – Citizen

回答

2

沒有,沒有標準,正如其他人已經回答......然而,在回答您的問題有關創建方法太多.. 。我通常只有一個search()方法,它根據我的搜索條件返回一個或多個結果。我通常會創建一個「搜索對象」,其中包含我的OOP時尚條件,然後可以通過數據層進行分析......但這可能比您想要的要多......許多人會爲他們的DQL構建自己的DQL數據層等。有很多方法可以避免getById,getByColor,getByTexture,getByColorAndTexture。如果你開始看到很多方法來覆蓋搜索的每一個可能的組合,那麼你可能做錯了。

至於休息方法的命名... ZF2不是答案,但它是我目前在我的項目中使用的一個,它的方法是這樣佈置的(請注意,這是可怕的,危險的代碼...打開SQL注入......只是做舉例):

// for GET URL: /api/fruit?color=red 
public function getList() { 
    $where = array(); 
    if(isset($_GET['color'])) { 
     $where[] = "color='{$_GET['color']}'"; 
    } 
    if(isset($_GET['texture'])) { 
     $where[] = "texture='{$_GET['texture']}'"; 
    } 
    return search(implode(' AND ',$where)); 
} 
// for GET URL: /api/fruit/3 
public function get($id) { 
    return getById($id); 
} 
// for POST URL /api/fruit 
public function create($postArray) { 
    $fruit = new Fruit(); 
    $fruit->color = $postArray['color']; 
    save($fruit); 
} 
// for PUT URL /api/fruit/3 
public function update($id, $putArray) { 
    $fruit = getById($id); 
    $fruit->color = $putArray['color']; 
    save($fruit); 
} 
// for DELETE /api/fruit/3 
public function delete($id) { 
    $fruit = getById($id); 
    delete($fruit); 

} 
+0

謝謝!這很有道理。 – Citizen

+0

哦,上帝,我給了錯誤的答案賞金!無論如何,至少你得到了正確的答案。 – Citizen

+0

不用擔心,很高興我能回答這個問題:) –

2

前奏

是不是真的對於網址應該是什麼樣子標準或約定,蓋(幾乎)所有案件。

我能想到的唯一標準是HATEOAS(超媒體作爲應用程序狀態的引擎),它基本上規定客戶端應該從以前的請求中獲取它可以使用的url。這意味着網址是不是真的很重要(但客戶如何發現它們)。

REST現在是一種炒作方式,它通常不瞭解它的實際情況。我建議你閱讀Roy Fielding的論文Architectural Styles and the Design of Network-based Software Architectures,尤其是chapter 5

Richardson Maturity Model也是一個很好的閱讀。

PS:HAL(超文本應用程序語言)是實現HATEOAS的標準(其中包括)。

接口

因爲有上網址沒有標準,還存在用於對受試者接口沒有標準。它高度依賴於您的要求,您的口味,以及您構建應用程序的框架。

David Sadowski製作了a nice list庫和框架,可以幫助您開發RESTfull應用程序。我建議你看看他們中的幾個,看他們是否以及如何解決你遇到的問題。你應該能夠從他們那裏得到一些想法。

另請參閱我在前奏中提到的參考資料,因爲它可以讓您深入瞭解構建真正的REST應用程序的做法和不該做的事。 PS:對不起,沒有給你一個直截了當的明確答案! (我不認爲是真的存在。)

+0

對不起,我不是在問網址結構,我問是否有相應的「get」模型函數的標準。 – Citizen

2

您正在討論獲取過濾器。我更喜歡magento like filters 關於內部代碼的外觀沒有任何約定,並且沒有太多的php框架支持諸如開箱即用的過濾器之類的功能。你可以看看magento rest api的實現。

您可以使用函數調用類似$模型 - > GET($其中,$秩序,$限制) 但你應該

  • 定義國土資源屬性DB結果

  • 地圖資源屬性田

  • 定義其過濾資源支持

  • 支票FIL TER值,刪除不支持,並建立相應的$其中,$秩序,$限制

0

的開源庫phprs可滿足您的需求

隨着phprs,可以實現這樣的fruit.class :

/** 
* @path("/api/fruit") 
*/ 
class Fruit{ 
    /** 
    * @route({"GET","/"}) 
    * @param({"color","$._GET.color"}) 
    * @param({"limit","$._GET.limit"}) 
    */ 
    function getFruits($color,$limit){ 
     return $oFruit->get(NULL, array('color' =>$color),$limit); 
    } 
    /** 
    * @route({"GET","/*"}) 
    * @param({"id","$.path[2]"}) 
    */ 
    function getFruitById($id){ 
     return $oFruit->get($id); 
    } 
} 
相關問題