3

让我们举一个资源的通用示例,您可以使用 PHP 中构建的 restful API 进行建模。

  • 一个车库有多辆汽车和多个机械师。
  • 一辆车只有一个车库。
  • 一名机械师拥有多辆汽车和多个车库(他是个工作狂,好吧!)。

所以逻辑说我们的端点应该是

/v1/garages  
/v1/garages/1234
/v1/mechanics
/v1/mechanics/1234
/v1/cars
/v1/cars/1234

如果我们想获得车库 1234 的所有汽车,我们将使用 GET /v1/garages/1234/cars

如果我们想要 34 号车库中的 12 号机械师的所有汽车,我们将使用 GET /v1/mechanics/12/garage/34/cars

但是,如果我们想要 56 号和 78 号车库的所有汽车呢?
我有一些想法,但我能想到的最好的是 GET /v1/cars?garage=[id=[56,78]]

这将使我们能够从任何带有黄色油漆和碳纤维发动机罩的车库中通过 GET /v1/cars?garage=[paint=yellow,bonnet=[material=carbon]]&color=green&doors=[2,4]

这似乎是一个合理的想法,还是我会遇到嵌套复杂的问题,这是否足够容易用 PHP 解析?

据我所知,我的另一个想法是 Json,所有 json 在 url 中都是有效的,所以

GET /v1/cars?{"color":"green","doors":[2,4],"garage":{"paint":"yellow","bonnet":{"material":"carbon"}}}

这使得开发人员使用起来非常容易,因为现在几乎所有的编程语言都支持 json,并且在 API 端我们可以直接使用json_decode($_SERVER[''QUERY_STRING]),那么使用 Json 有什么问题吗?

第三个想法“创建搜索”

我的意思是我们使用

POST /cars/search使用上面的 Json 作为发布数据,该请求将简单地返回搜索的 ID,然后可以通过它获取结果,GET /cars/search/{id}这将减轻我这边的复杂性并避免请求的 8kb 限制(这是一个 API,并不意味着由浏览器地址栏使用)。但我担心如果我这样做,那么它会破坏顶级GET /v1/cars端点的目的吗?

4

1 回答 1

0

感谢#laravel irc 频道的乐于助人的人,我与他们进行了长时间的交谈,我们得到了一个似乎有效的答案。

我们基于以下几点选择了这个答案:

  • 易于人类阅读
  • 查询的力量
  • 平坦度(易于解析)
  • 易于过滤

基本要求是

GET /v1/cars?color=green
            &doors=2,4
            &garage[paint]=yellow
            &garage[bonnet][material]=carbon

与以下代码结合使用时

$query = array();
parse_str($_SERVER['QUERY_STRING'], $query);

吐出一个像下面这样的数组,可以在 API 中轻松地对其进行迭代以进行过滤:)

Array
(
  [color] => green
  [doors] => 2,4
  [garage] => Array
    (
      [paint] => yellow
      [bonnet] => Array
        (
          [material] => carbon
        )
    )
)
于 2013-08-24T03:31:06.063 回答