在一个宁静的水果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 /数据库功能总是一团糟?我真的很想标准化我的功能。
答案 0 :(得分:2)
<强>前奏强>
对于网址的外观,并没有真正的标准或惯例,涵盖(几乎)所有情况。
我能想到的唯一标准是HATEOAS(超媒体作为应用程序状态的引擎),它基本上表明客户端应该从以前的请求中获取它可以使用的URL。这意味着网址的内容并不重要(但客户端如何发现它们)。
REST现在是一种炒作,而且往往不了解它究竟是什么。我建议您在Architectural Styles and the Design of Network-based Software Architectures上阅读Roy Fielding的论文,尤其是chapter 5。
Richardson Maturity Model也是一本很好的读物。
PS:HAL(超文本应用语言)是实施HATEOAS的标准(以及其他)。
<强>接口强>
由于网址上没有标准,因此该主题的接口也没有标准。这在很大程度上取决于您的要求,您的品味,以及您正在构建应用程序的框架。
David Sadowski已经制作了a nice list个可以帮助您开发RESTfull应用程序的库和框架。我建议你看看其中的几个,看看他们是否以及如何解决你遇到的问题。你应该能够从他们那里得到一些想法。
另请阅读我在前奏中提到的参考资料,因为它将为您提供有关构建真实RESTfull应用程序的注意事项和非注意事项的良好见解。
PS:很抱歉没有给你一个直截了当的明确答案! (我认为不存在。)
答案 1 :(得分:2)
您正在谈论获取过滤器。我更喜欢magento like filters 没有关于你的内部代码应该如何看的惯例,也没有那么多的php框架支持诸如get过滤器之类的功能。你可以看一下magento rest api的实现。
您可以使用函数调用,例如$ model-&gt; get($ where,$ order,$ limit) 但你应该
定义资源属性
将资源属性映射到数据库结果字段
定义哪些过滤器资源支持
检查过滤器,删除不受支持的内容并构建相应的$ where,$ order,$ limit
答案 2 :(得分:2)
不,没有标准,因为其他人已经回答了......但是,在回答你关于创建太多方法的问题时...我通常只有一个search()方法,它返回一个或多个结果基于我的搜索条件。我通常会创建一个“搜索对象”,其中包含我的OOP方式的条件,然后可以通过数据层进行解析...但这可能比您想要进入的更多...很多人会为他们构建他们的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);
}
答案 3 :(得分: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);
}
}