使用GET Params的REST API

时间:2014-10-30 23:41:30

标签: rest httprequest getparameter

假设我们有以下服务器资源:

api.example.com/event/1

返回一些任意资源,比如说:

{
    id: 1,
    details: {
        type: 'webinar',
        ....
    },
    attendees: [
        {
            user_id: 1,
            first_name: 'Bob'
            ...
        },
        ...
    ]
}

客户端发出请求以获取事件的事件详细信息而不是参与者列表可能会很有用。

为资源提供两个单独的URL是否更好?如果客户需要两个资源,是否强制执行两个单独的请求?

api.example.com/event/{event_id}
api.example.com/attendees/{event_id}

或者提供相同的两个端点更好,但可选择让第一个端点支持GET参数来打开或关闭与会者列表

api.example.com/event/{event_id}?listAttendees={true|false}
api.example.com/attendees/{event_id}

listAttendees参数将使表示返回与会者列表。

通常的做法是允许GET参数更改从特定URL返回的表示形式吗?

1 个答案:

答案 0 :(得分:0)

我说在REST中最正确的方法是使用不同的媒体类型或媒体类型参数,但由于大多数人不使用自定义媒体类型,我经常使用我称之为缩放协议的东西。这个想法是你有一个zoomexpand参数,带有一个数值,它递归地包含子实体,减少参数直到达到零。

所以,请求如下:

GET api.example.com/event/1

返回事件资源的普通表示,而不嵌入任何内容。请求如:

GET api.example.com/event/1?zoom=1

包括活动的直接孩子,在您的情况下,是参加者。接下来:

GET api.example.com/event/1?zoom=2

将包括活动的直系子女,参加者的直系子女。

要回答您的问题,在REST中,整个URI是一个原子标识符,因此参数是URI的一部分。如果您正在使用不会以相同方式解释URI的内容,例如不使用查询字符串来缓存URI的旧缓存服务器,那么这可能会成为一个问题。