Rails 大家在开发 rails api 的时候是否遵循 jsonapi 规范

zeekerpro · September 22, 2023 · Last by stephen replied at September 26, 2023 · 1884 hits

最近打算搞一个 rails API 前后端分离的项目,在使用 json 做数据交互的时候犹豫是否需要遵循jsonapi规范,

但是如果这样做的话就需要在后端做一次 serialize,然后数据到前端了还要做一遍 deserialize 的操作,这么做是否值得?

我之前用 json API 规范开发过一个项目,个人觉得 jsonapi 的接口有几个优点:

  1. 数据规范
  2. 对于复杂关联的数据结构可以通过 relationships 和 included 节省数据传输大小。 例如:
model A {
  has_many: modelB
}

正常查 modelA 列表,并 include model B 的时候,直接返回 json 的结构:

[
  A1: {
     ...
    bs: [b1, b2, b3 ...]
  },
  A2: {
     ...
    bs: [b1, b2, b3 ...]
  }
]

这时候如果 modelB 的属性多的话,b1, b2,b3 .. 等都会重复 to json,最后返回的 json 字符串就会很长。

如果使用 jsonapi 规范做序列化,会得到下面的结构:

data: [
  A1: {
    ...
    relationtships: {
      bs: [b1.id, b2.id, b3.id .....]
    }
  },
  A2: {
    ...
    relationtships: {
      bs: [b1.id, b2.id, b3.id .....]
    }
  }
],
included: [
  b1, b2, b3 ...
]

在 relationships 中只存了 relation 的 id,b1, b2, b3 都只做一遍序列化,然后存到 included 中

但是缺点也很明显:后端序列化后,前端又要做一遍反序列化,感觉有点麻烦。

不知道大家对于 jsonapi 规范是持什么态度,有踩过哪些坑么?

另外,我目前用的数据序列化和反序列化的轮子:

后端:jsonapi-serializer

前端:jsonapi-serializer

如果有比较好用的轮子也推荐一下。

不遵守 jsonapi 规范的话,我就用的 jbuilder。

看个人习惯啦,如果只是自己维护,怎么顺手怎么来

我一直在用的 后端 jsonapi-resources 前端 kitsu-core

一直使用 code、message、data

没必要,大家前后,定一个规则就好了,除非你说大公司。

小公司,几个人的,非得整 jsonapi,那就离撕逼不远了。

Reply to betang

感谢分享,前端这个库还是第一次知道,先去了解一下

Reply to cisolarix

这算不算另外一种 jsonapi 规范,哈哈

使用 jsonapi 后,当遇到 relationtships 和 included 多的情况,开发时用 postman 或 insomnia 来调试结果相当崩溃,没有普通 json 那样方便检查。有尝试安装 insomnia 的 jsonapi 插件,目测没变化,header 里面加入了 application/vnd.api+json 也没看出来和安装插件之前有何区别。

曾经用过,不建议使用,心智负担大,用了别人库,更新也很麻烦

Reply to kyvision

确实,这种单独调试接口会比较难受

曾经也想试试 jsonapi, 但是团队里已经对 graphql 比较熟练了,对比下来 jsonapi 没有明显的优势,就没尝试用它来启新项目

没必要整那么严格

搞复杂了。jbuilder 就很好。

Reply to zeekerpro

用自己最熟悉的格式就行

有时候完全按规范,太啰嗦。只要所有项目都用统一标准,其实习惯了也没什么。

You need to Sign in before reply, if you don't have an account, please Sign up first.