我想设计一个讨论公交车站的REST API。
E.g。
GET /stations/1asca2dac34
{
name: 'Queen str.'
lat: 50.45
lon: 9.63
}
我的目标是在电台之间代表距离。例如,站AAA和BBB之间的距离是5km。我不是REST设计的专家。设计这种1:1关系的最佳方法是什么?
我可以考虑以下解决方案,但我不确定它们是否适合REST风格。
1)
GET /distances/?station1=AAA&station2=BBB
{
uid: 123
station1=AAA
station2=BBB
km: 5
}
2)
GET /distances/AAA/BBB
{
uid: 123
station1=AAA
station2=BBB
km: 5
}
3)
GET /distances/123
{
uid: 123
station1=AAA
station2=BBB
km: 5
}
答案 0 :(得分:3)
我会使用类似的东西:
/stations/1asca2dac34/distance?from=432dscas
客户起点可以是 / station ,在那里他可以获得所有车站的名单(名称,身份证,地理位置,公交车,火车等交通工具)你的API。
从那时起,通过使用 HATEOAS ,您可以提供指向所有底层资源的客户端链接,例如:
/stations/{id}/distance?from={id}
也许还有其他一些与站有关的东西:
/stations/{id}/trains/timetable
/stations/{id}/trains/{train_id}/timetable
/stations/{id}/foobar
如果你从/距离开始有点奇怪,因为我不能“猜测”它会返回什么样的列表。让我先说你的选择没有错,但最重要的是让你的客户消费者明智/“猜测”。
同意Joshua Moore所说的问题。 “距离”资源是否对您的消费者有意义,或者是否可以从一个起点(例如站点)散开所有内容,因为这就是您的API全部/唯一的内容?
答案 1 :(得分:1)
您的所有示例实际上都是REST样式的URI。这是一个意见和适用性的问题。考虑您的目标受众。 #1很有意义,因为您为查询提供参数。对于API的消费者而言,#2似乎很难理解,#3更加抽象,并假设您的API消费者知道数据的uid。
您应该问“哪些最适合我的消费者需要?”
我的拙见。
答案 2 :(得分:1)
我建议您将电台的起点设为/stations/{id}
,然后您可以在此处公开指向/stations/{id}/distances
的链接。第二个URI将列出从此站到所有其他站的距离,您希望如何呈现该数据由您决定。最终的URI采用/stations/{id-a}/distances/{id-b}
形式,可以返回一个非常简单的数字。作为一般规则,如果可以,我会避免使用查询字符串。
答案 3 :(得分:0)
另一种没有查询的RESTful可能性是使用URI分隔符。
GET / stations / {st_a; st_b}
通过这种设计,您的URI非常简单。分号意味着可互换的ID(Richardson第一本书)。
返回JSON是一个简单的值。 距离是我的资源,因为它是来自计算的值。