我正在寻找一种合理的方法将搜索表示为RESTful url。
设置:我有两个模型,汽车和车库,汽车可以在车库。我的url是这样的:
/car/xxxx
xxx == car id
returns car with given id
/garage/yyy
yyy = garage id
returns garage with given id
Car可以独立存在(因此有/ Car),也可以存在于车库中。如何正确地表示给定车库中的所有汽车?喜欢的东西:
/garage/yyy/cars ?
车库里的车yyy和zzz的组合呢?
用什么正确的方式来表示搜索具有特定属性的汽车?说:给我看所有四门的蓝色轿车。
/car/search?color=blue&type=sedan&doors=4
或者应该改为/cars ?
在这里使用“搜索”似乎不合适——还有什么更好的方式/术语吗?它应该是:
/cars/?color=blue&type=sedan&doors=4
搜索参数应该是PATHINFO或QUERYSTRING的一部分吗?
简而言之,我正在寻找跨模型REST url设计和搜索的指导。
[更新]我喜欢贾斯汀的答案,但他没有涵盖多领域搜索的情况:
/cars/color:blue/type:sedan/doors:4
或者类似的东西。我们如何从
/cars/color/blue
多域的情况?
我使用两种方法来实现搜索。
1)最简单的情况,用于查询相关元素,并用于导航。
/cars?q.garage.id.eq=1
这意味着,查询车库ID等于1的汽车。
也可以创建更复杂的搜索:
/cars?q.garage.street.eq=FirstStreet&q.color.ne=red&offset=300&max=100
FirstStreet所有车库中不是红色的汽车(第三页,每页100个元素)。
2)复杂查询被认为是常规资源,可以被创建和恢复。
POST /searches => Create
GET /searches/1 => Recover search
GET /searches/1?offset=300&max=100 => pagination in search
创建搜索的POST正文如下:
{
"$class":"test.Car",
"$q":{
"$eq" : { "color" : "red" },
"garage" : {
"$ne" : { "street" : "FirstStreet" }
}
}
}
它基于Grails(标准DSL): http://grails.org/doc/2.4.3/ref/Domain%20Classes/createCriteria.html
我使用两种方法来实现搜索。
1)最简单的情况,用于查询相关元素,并用于导航。
/cars?q.garage.id.eq=1
这意味着,查询车库ID等于1的汽车。
也可以创建更复杂的搜索:
/cars?q.garage.street.eq=FirstStreet&q.color.ne=red&offset=300&max=100
FirstStreet所有车库中不是红色的汽车(第三页,每页100个元素)。
2)复杂查询被认为是常规资源,可以被创建和恢复。
POST /searches => Create
GET /searches/1 => Recover search
GET /searches/1?offset=300&max=100 => pagination in search
创建搜索的POST正文如下:
{
"$class":"test.Car",
"$q":{
"$eq" : { "color" : "red" },
"garage" : {
"$ne" : { "street" : "FirstStreet" }
}
}
}
它基于Grails(标准DSL): http://grails.org/doc/2.4.3/ref/Domain%20Classes/createCriteria.html