在水果的 Restful API 中,请求假设如下:
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/数据库功能总是一团糟?我真的很想标准化我的功能。
不,没有其他人已经回答过的标准...但是,为了回答您关于创建太多方法的问题...我通常只有一个 search() 方法,该方法根据我的搜索返回 1 个或多个结果标准。我通常创建一个“搜索对象”,其中以 OOP 方式包含我的 where 条件,然后可以由数据层解析...但这可能超出您想要的范围...许多人会为其构建 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);
}
前奏
对于 url 的外观并没有真正的标准或约定,可以涵盖(几乎)所有情况。
我能想到的唯一标准是HATEOAS(超媒体作为应用程序状态引擎),它基本上规定客户端应该从以前的请求中派生出它可以使用的 url。这意味着 URL 是什么并不重要(重要的是客户端如何发现它们)。
REST 如今是一种炒作,但人们常常不理解它到底是什么。我建议您阅读 Roy Fielding 的论文《架构风格和基于网络的软件架构设计》,尤其是第 5 章。 理查森成熟度模型也是一本好书。
PS:HAL(超文本应用程序语言)是实现 HATEOAS 的标准(除其他外)。
因为 url 没有标准,所以该主题的接口也没有标准。这在很大程度上取决于您的要求、您的品味,以及您正在使用什么框架构建应用程序。 David Sadowski 制作了
一个很好的库和框架列表,可以帮助您开发 RESTfull 应用程序。我建议您看一下其中的几个,看看它们是否以及如何解决您遇到的问题。您应该能够从他们那里得到一些想法。
另请阅读我在序言中所做的参考资料,因为它将让您深入了解构建真正的 RESTfull 应用程序的注意事项。 PS:很抱歉没有给您一个简单明确的答案! (我不认为真的存在。)
您正在谈论获取过滤器。我更喜欢
magento 之类的过滤器使用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);
}
}