一些一般设计问题:
https://developers.google.com/+/api/latest/activities/list#nextPageToken
为什么服务器会返回令牌以检索下一个分页结果?这不会打破无国籍的想法吗?
为什么不直接传递像LIMIT name = value这样的MySQL作为参数?服务器现在必须返回我想要的页数...我错过了什么?
第二个回复提供了以下示例。
GET http://api.domain.com/user/<id>
GET http://api.domain.com/users
PUT http://api.domain.com/user/<id>
POST http://api.domain.com/users
DELETE http://api.domain.com/user/<id>
有道理,但为什么有两个复数资源?是否可以假设如果查询“user”并且为NULL或者未提供“all”的意图?同样适用于POST?如果复数是为了提高可读性 - 为什么DELETE没有“用户”资源?
最终,我理解REST意味着...表示单个资源 - 使用HTTP谓词(GET,PUT,POST,DELETE)来实质上管理该资源 - 类似于CRUD。
编辑|最后,我还想问为什么Google API会在URI中发送API版本而不是使用HTTP标头?有原因吗?为了与老客户进行向后竞争?
评论
答案 0 :(得分:1)
为什么服务器会返回一个令牌来检索下一个分页结果?这不会打破无国籍的想法吗?
对分页结果集使用这种机制是完全标准的,并没有打破无状态的想法。请考虑以下示例。
假设GET /users?after=<after>
(其中after
是可选的)应该以分页方式返回所有用户的列表,例如&lt; =每页4个。
客户端发出的第一个请求是GET /users
,其响应可能如下所示(格式为JSON)。
{
"users": [ "alex", "bob", "carter", "dan" ]
"more_after": "dan"
}
在此示例中,more_after
属性指定用户列表中可能还有更多用户。因此,客户端然后请求GET /users?after=dan
并获得第二个响应,如下所示。
{
"users": [ "edward", "frank" ]
}
缺少more_after
属性表示这是用户的最后一页。
现在的问题是:用作页面分隔符的“dan
”标记是否打破了我们想要的“无状态”属性?显然答案是否定的。服务器不必记住两个GET
请求之间的任何内容。没有会话的概念。需要在两个GET
请求之间保持持久的任何状态仅存在于客户端 - 这是重要的区别。在服务调用之间让客户端保持状态是完全可以接受的 - 并且通常是必需的。