35

我在 Web 服务中有一个 RESTful API,其中包含用户、帖子等资源。当我请求一个帖子列表(GET /posts)时,我想检索一个帖子数组,每个帖子只有有限的数据(即主题、作者姓名)。当我请求具体帖子 (GET /posts/42) 时,我想检索帖子对象字段的完整列表,包括大帖子正文、有关喜欢计数的附加信息、评论计数。我想有很多方法可以解决这个问题。
在我看来,最明显的三个是:

  1. 在每个请求上显式指定一个字段列表(/posts?fields=subject,author_name/posts/42?fields=subject,body,createAt,author_name,comments_count,likes_count,等等...)。
  2. 仅当字段列表与默认字段列表不同时,才显式指定字段列表。
  3. 如果所需的字段集与默认值不同,则指定应从(到)默认字段集排除(或包含)的字段列表。

我想为我的客户构建一个清晰有用的 API。我应该选择哪种方式?

4

2 回答 2

43

我会选择选项 2 恕我直言。

因此,如果消费者只是请求资源 url ( /posts/42),他们会收到默认字段。

然后消费者可以通过在查询字符串中定义值来更改默认响应,例如:

/posts/42/fields?subject,author_name

这在过去对我来说效果很好,并且是其他一些众所周知的 API 的工作方式,例如Facebook

编辑:回顾一下,我会将请求更改为:

/posts/42?fields=subject,author_name

/post/42是资源,而不是字段。

于 2013-08-14T18:11:33.860 回答
11

也一直在对此进行研究,并指出 Facebook 的 GraphQL 作为请求具有所需字段的 restful api 的替代方案。它仍处于早期阶段,但似乎很有希望。

https://facebook.github.io/react/blog/2015/05/01/graphql-introduction.html

编辑:转载自网址:

GraphQL 查询是由服务器解释的字符串,它以指定格式返回数据。这是一个示例查询:

{
  user(id: 3500401) {
    id,
    name,
    isViewerFriend,
    profilePicture(size: 50)  {
      uri,
      width,
      height
    }
  }
}

(注意:此语法与之前的 GraphQL 示例略有不同。我们最近一直在对语言进行改进。)

这是对该查询的回复。

{
  "user" : {
    "id": 3500401,
    "name": "Jing Chen",
    "isViewerFriend": true,
    "profilePicture": {
      "uri": "http://someurl.cdn/pic.jpg",
      "width": 50,
      "height": 50
    }
  }
}
于 2015-10-16T19:16:29.923 回答