我正在寻找一种合理的方法将搜索表示为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
多域的情况?
虽然在路径中设置参数有一些优势,但在我看来,还有一些重要因素。
Not all characters needed for a search query are permitted in a URL. Most punctuation and Unicode characters would need to be URL encoded as a query string parameter. I'm wrestling with the same problem. I would like to use XPath in the URL, but not all XPath syntax is compatible with a URI path. So for simple paths, /cars/doors/driver/lock/combination would be appropriate to locate the 'combination' element in the driver's door XML document. But /car/doors[id='driver' and lock/combination='1234'] is not so friendly.
There is a difference between filtering a resource based on one of its attributes and specifying a resource.
For example, since
/cars/colors returns a list of all colors for all cars (the resource returned is a collection of color objects)
/cars/colors/red,blue,green would return a list of color objects that are red, blue or green, not a collection of cars.
To return cars, the path would be
/cars?color=red,blue,green or /cars/search?color=red,blue,green
Parameters in the path are more difficult to read because name/value pairs are not isolated from the rest of the path, which is not name/value pairs.
最后一个评论。我更喜欢/garages/yyy/cars(总是复数)而不是/garage/yyy/cars(也许这是原始答案中的一个拼写错误),因为它避免了在单数和复数之间改变路径。对于加了's'的单词,变化不是很糟糕,但将/person/yyy/friends改为/people/yyy似乎很麻烦。
我的建议是:
/garages
Returns list of garages (think JSON array here)
/garages/yyy
Returns specific garage
/garage/yyy/cars
Returns list of cars in garage
/garages/cars
Returns list of all cars in all garages (may not be practical of course)
/cars
Returns list of all cars
/cars/xxx
Returns specific car
/cars/colors
Returns lists of all posible colors for cars
/cars/colors/red,blue,green
Returns list of cars of the specific colors (yes commas are allowed :) )
编辑:
/cars/colors/red,blue,green/doors/2
Returns list of all red,blue, and green cars with 2 doors.
/cars/type/hatchback,coupe/colors/red,blue,green/
Same idea as the above but a lil more intuitive.
/cars/colors/red,blue,green/doors/two-door,four-door
All cars that are red, blue, green and have either two or four doors.
希望这能让你们明白。从本质上讲,你的Rest API应该很容易被发现,并且应该允许你浏览你的数据。使用url而不是查询字符串的另一个优点是,您可以利用web服务器上存在的用于HTTP流量的本机缓存机制。
这里有一个页面链接,该页面描述了REST中查询字符串的害处:http://web.archive.org/web/20070815111413/http://rest.blueoxen.net/cgi-bin/wiki.pl?QueryStringsConsideredHarmful
我使用谷歌的缓存,因为正常的页面不为我工作,这里的链接以及:
http://rest.blueoxen.net/cgi-bin/wiki.pl?QueryStringsConsideredHarmful