@
chaleaochexist lz 用的是什么框架?如果是 flask 的话,可以去了解一下 flask-rest-jsonapi,这个库是对 jsonapi1.0 规范进行了封装。
了解这个库,可以帮助你很好理解这些概念。
以请求 api/users 为例,数据流如下:
GET 方法:路由层->resource 层(找到对应 model )->model 层->resource 层(过滤输出)->返回结果
POST/PATCH 方法:路由层->resource 层(过滤输入)->model 层->resource 层(过滤输出)->返回结果
一,路由层:根据路由,找到对应的 resource。
二,Resource 层:即逻辑数据抽象层。关键词是“逻辑”,并非暴露实际数据库的数据,可根据业务逻辑进行自定义。因为 resource 并不一定和数据库的 model 一一对应。这句话有几层含义
1.一个 resource 可以对应一个 model,但并不意味着 model 的数据会全部返回,比如 password 字段需要经过过滤。(最正常的情况)
2.多个 resource 可以对应一个 model。比如 api/male_users, api/female_users 都对应 users,婚恋网站可能有这样的需求。
3.一个 resource 对应多个 model。比如数据库中有 2 张表(table) user 和 article。每次请求 users 返回用户最新五篇 article 的标题。
4.一个 resource 甚至可以不是数据库的 model。比如 api/sessions,当 post 的就是用户登录,如果验证成功,就返回一个 token。但数据库中并没有 sessions 的 table,验证过程是比较数据库中 user 的密码和传来的密码。
以上就是 resource 层,在 flask-rest-jsonapi 中是通过预定义 schema 来实现的,schema 可以理解成 resource 的 table,输入输出都会经过 schema 过滤。
[关于 serialize 和 deserialize]
Resource 中 Schema 过滤的过程就是 serialize (输出过滤)和 deserialize (输入过滤)的过程。
1 输入过滤:通过 deserialize 就是把远程传过来(可能脏的)数据变成 python 的字典对象。
2 输出过滤:通过 serialize 就是把 python 对象变成格式化的字符串返回给客户端。