这里有两个问题:
- 在服务器或客户端与 JSON API 进行转换是否更好?
- 如果在客户端进行转换,JSON API 的转换发生在哪里?
在服务器或客户端与 JSON API 进行转换是否更好?
第一个问题实际上是一个偏好问题。我个人更喜欢让服务器发出和接受 JSON API 格式,因为它允许您向客户端发送更少的 JavaScript 行,并且多个客户端倾向于与同一服务器通信,因此标准化可以加快客户端应用程序的开发。
例如,您可能有两个 Ember 客户端(一个面向普通用户,一个面向管理员)、一个 iOS 客户端,可能还有另一台服务器都向您的 PostgREST 服务器发出请求。
也就是说,您也可以将 PostgREST 使用的格式视为自己的规范,并让所有客户端都遵守该规范。
如果在客户端进行转换,JSON API 的转换发生在哪里?
这就引出了问题 2:如何让 Ember Data 与不使用 JSON API 标准的服务器进行通信?
这发生在两个地方:Adapter和Serializer。
适配器将数据请求转换为可以找到(或添加)数据的适当 URL 并启动请求。
因此,“给我一张 ID 为 22 的照片”(store.find('photo', 2)
),将询问适配器(假设照片 #2 尚未加载),“嘿,有人想要照片 #2,请去取它”。
适配器将发出请求并将响应交给其序列化器。
序列化器负责将返回的数据转换为 Ember Data 可以理解的格式:JSON API。
Adapter 和 Serializer 都有可以实现的方法来自定义它们的行为。
在您使用 PostgREST 的情况下,最好的起点是findRecord
在 Adapter 上实现您自己的normalizeResponse
并在 Serializer 上实现您自己的。
两者的文档都解释了您需要采取的操作以及您应该从每种方法返回什么类型的值。
这是两个最基本的接口。它们没有提供很多开箱即用的功能,但会帮助您熟悉这两个对象的交互方式。
一旦您对这种基本交互感到满意,请查看示例RestAdapter和RestSerializer以了解如何依赖适配器和序列化器必须提供的一些约定来清理您编写的任何自定义代码。