用于高级过滤静默API结果的URL设计

我们来举一个你可能使用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]抓住所有带有黄色油漆和碳纤维帽的车库中的两个或四个车门的所有绿色汽车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 POST /cars/search作为发布数据,请求将简单地返回搜索结果可以通过GET /cars/search/{id}这将缓解我身边的复杂性并避免8kb的请求限制(这是一个API,并不打算被浏览器地址栏使用)。 但是我担心如果我这样做,那么它会打败顶级GET /v1/cars终端的目的?


    感谢#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
            )
        )
    )
    
    链接地址: http://www.djcxy.com/p/40959.html

    上一篇: URL design for advanced filtering of results in restful API

    下一篇: RESTful URI design