在RESTful API请求中指定资源字段列表的方法

Iva*_*hko 30 api rest restful-architecture

我在Web服务中使用RESTful API,具有某些资源,如用户,帖子等.当我提出帖子列表(GET /帖子)的请求时,我想要检索每个帖子(即主题,作者姓名)的减少部分数据的帖子数组.当我提出具体帖子的请求(GET/posts/42)时,我想检索帖子对象字段的完整列表,包括大帖子体,关于喜欢计数,评论计数的其他信息.我想存在很多解决这个问题的方法.在我看来,最明显的3个是:

  1. 在每个请求上明确指定字段lits(/ posts?fileds = subject,author_name和for/posts/42?fields = subject,body,createaAt,author_name,comments_count,likes_count等...).
  2. 仅当字段列表与默认字段列表不同时才明确指定字段列表.
  3. 如果所需字段设置与默认字段不同,请指定应从(设置)默认字段中排除(或包含)的字段列表.

我要为我的客户构建清晰有用的API.我应该选择哪种方式?

Dan*_*nds 32

我会选择2恕我直言.

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

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

/posts/42/fields?subject,author_name

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

编辑:回头看看我要改变请求:

/posts/42?fields=subject,author_name

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


asc*_*kes 8

一直在研究这个问题,并指出Facebook的GraphQL作为一个替代方案来请求与所需字段的宁静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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

这是对该查询的响应.

{
  "user" : {
    "id": 3500401,
    "name": "Jing Chen",
    "isViewerFriend": true,
    "profilePicture": {
      "uri": "http://someurl.cdn/pic.jpg",
      "width": 50,
      "height": 50
    }
  }
}
Run Code Online (Sandbox Code Playgroud)