相应的restful PHP函数有标准吗?

问题描述 投票:0回答:4

在水果的 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/数据库功能总是一团糟?我真的很想标准化我的功能。

php rest standards
4个回答
2
投票

不,没有其他人已经回答过的标准...但是,为了回答您关于创建太多方法的问题...我通常只有一个 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);

}

2
投票

前奏

对于 url 的外观并没有真正的标准或约定,可以涵盖(几乎)所有情况。

我能想到的唯一标准是HATEOAS(超媒体作为应用程序状态引擎),它基本上规定客户端应该从以前的请求中派生出它可以使用的 url。这意味着 URL 是什么并不重要(重要的是客户端如何发现它们)。

REST 如今是一种炒作,但人们常常不理解它到底是什么。我建议您阅读 Roy Fielding 的论文《架构风格和基于网络的软件架构设计》,尤其是第 5 章。 理查森成熟度模型也是一本好书。

PS:HAL(超文本应用程序语言)是实现 HATEOAS 的标准(除其他外)。

界面

因为 url 没有标准,所以该主题的接口也没有标准。这在很大程度上取决于您的要求、您的品味,以及您正在使用什么框架构建应用程序。 David Sadowski 制作了

一个很好的库和框架列表

,可以帮助您开发 RESTfull 应用程序。我建议您看一下其中的几个,看看它们是否以及如何解决您遇到的问题。您应该能够从他们那里得到一些想法。

另请阅读我在序言中所做的参考资料,因为它将让您深入了解构建真正的 RESTfull 应用程序的注意事项。 PS:很抱歉没有给您一个简单明确的答案! (我不认为真的存在。)

您正在谈论获取过滤器。我更喜欢

magento 之类的过滤器

2
投票

您可以使用 $model->get($where, $order, $limit) 等函数调用 但你应该

定义资源属性

  • 将资源属性映射到数据库结果字段

  • 定义哪些过滤器资源支持

  • 检查过滤器,删除不支持的并构建相应的$where、$order、$limit

  • 开源库
phprs

0
投票

使用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); } }

© www.soinside.com 2019 - 2024. All rights reserved.