JSON API 用于非资源响应

JSON API for non-resource responses

目前,我正在开发新产品并为 public 和内部需求制作 REST API。我从 {json:api} 规范开始,我对它非常满意,直到遇到一些我找不到答案的问题。

根据JSON API规范,每个资源必须包含id.

http://jsonapi.org/format/

Every resource object MUST contain an id member and a type member. The values of the id and type members MUST be strings.

这在很多情况下都很好,但不是全部。

我们的大部分端点都是关于 "resources"

如果我要 "things" 合集 (http://example.com/things)

{
  "data": [{
    "type": "things",
    "id": "1",
    "attributes": {
      "title": "first"
    },
    "links": {
      "self": "http://example.com/things/1"
    }
  }, {
    "type": "things",
    "id": "1",
    "attributes": {
      "title": "second"
    },
    "links": {
      "self": "http://example.com/things/2"
    }
  }]
}

如果我请求单个 "things" 资源 (http://example.com/things/1)

{
  "data": {
    "type": "things",
    "id": "1",
    "attributes": {
      "title": "first"
    },
    "links": {
      "self": "http://example.com/things/1"
    }
  }
}

但是与资源无关且没有 ID 的端点怎么办?

例如,在我们的应用程序中,有一个端点 http://example.com/stats 应该 return 当前登录用户 的统计数据 。喜欢

{
  "active_things": 23,
  "last_login": "2017"
}

此 "resource" 没有 ID(它实际上不是资源,是吗?)。后端只是为登录用户收集一些 "stats" 和 returns 一个统计对象。在这个应用程序中有很多这样的端点,例如,我们有 通知中心 页面,用户可以在其中更改不同通知的电子邮件地址。

因此前端应用程序(单页应用程序)首先必须获取当前值并将请求发送到 GET http://example.com/notification-settings

{
  "notifications_about_new_thing": "arunas@example.com",
  "notification_about_other_thing": "arunas@example.com"
}

像这样的端点还有很多。问题是 - 如何以 JSONAPI 格式 return 这些响应?这些端点中没有 ID。

最大的问题是 - 为什么没有其他人面临这个问题(至少我找不到关于这个的任何讨论)? :D 我做过的所有 APIs 都有一些没有 "id".

的端点

我有两个想法,第一个是伪造 id,例如 "id": "doesnt_matter",第二个 - 不要对这些端点使用 json-api。但我不喜欢他们两个。

思考 RESTful,一切都可以(必须)成为资源。没有 "logged in" 用户,因为 RESTful API 中没有会话,因为它们是无状态的。在 REST API 调用之间没有维护会话状态,因此您必须明确说明用户是谁。

在这种情况下,资源是具有某些统计属性的用户(在简单情况下)或者可能是与单独统计关系的关系(更复杂,未显示):

GET /users/1234 { "data": { "type": "users", "id": "1234", "attributes": { "name": "etc.", "active_things": 23, "last_login": "2017" } } }

我不是 JSON API 专家-但值得注意的是,虽然 JSON API 是一个具体规范,但它与 JSON,也不作为 REST API。如果你不喜欢它的语义,我同意评论者的观点,"Don't use it." 如果你 打算使用 JSON API,那就这样做吧以合规的方式,每个响应都是一种资源;每个资源都有一个 ID 和一个类型;附加信息作为资源的属性提供。

针对您的问题,我正在考虑与我的应用程序 returns 计算结果类似的问题。现在一方面,这些并不是严格的 "resources",所以我一直在考虑将原始结果作为数组返回的想法(我认为这将是 valid JSON,但需要注意),例如:

[ 47 ] 

另一方面,有人认为结果是客户指定 RESTfully 的计算结果,在这种情况下,以下两种情况之一可能为真:

  • 稍后提交的相同请求很可能有相同的结果。这表明实际上结果 资源。
  • 稍后提交的相同请求很可能会得到不同的结果。这表明客户端可能希望跟踪各种查询的结果如何变化,因此至少查询参数应该是响应的一部分。

在这两种情况下,响应实际上是一个 'result' 对象,即使它本身没有 ID,它也有一个身份。如果没有其他合适的,ID 可以是生成响应的查询。

这对我来说 RESTful。用户 @n2ygk 表示,就 JSON API 规范而言,这是不正确的,一个 ID 应该只是一个唯一的 ID,而不应该有其他语义解释。

我很想听听其他观点。