用于高级过滤静默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