REST资源之间的1:1关系

时间:2013-12-16 10:39:18

标签: api rest restful-url api-design

我想设计一个讨论公交车站的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
}

4 个答案:

答案 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是一个简单的值。 距离是我的资源,因为它是来自计算的值。