一些一般的宁静api设计问题

时间:2013-04-08 00:19:19

标签: api rest

一些一般设计问题:

  1. 举个例子:
  2. https://developers.google.com/+/api/latest/activities/list#nextPageToken

    为什么服务器会返回令牌以检索下一个分页结果?这不会打破无国籍的想法吗?

    为什么不直接传递像LIMIT name = value这样的MySQL作为参数?服务器现在必须返回我想要的页数...我错过了什么?

    1. 我看了很多,但这个很有意思:
    2. REST Web Services API Design

      第二个回复提供了以下示例。

      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标头?有原因吗?为了与老客户进行向后竞争?

      评论

1 个答案:

答案 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请求之间保持持久的任何状态仅存在于客户端 - 这是重要的区别。在服务调用之间让客户端保持状态是完全可以接受的 - 并且通常是必需的。