ember-data 使用 postgrest 保存和查找
ember-data save and find with postgrest
ember-data 原生理解 json-api,如果我们必须将 ember-data 及其 save() 和 find() 方法与 postgrest 风格的 REST 调用集成,我们需要在哪里做变化 ?
我们是否需要修改 ember 中的客户端或某些服务器端逻辑以根据 ember-data 要求进行映射。
所以 postgrest REST api 调用看起来像这些来获取电影及其标题和 competition.name 来自相关 table ->
http://localhost:3001/film?select=title,competition{name}
http://localhost:3001/users?select=email::text&id=eq.2&sign_in_count=eq.16
这里有两个问题:
- to/from JSON API 是在服务端转换好还是在客户端转换更好?
- 如果在客户端进行转换,转换 to/from JSON API 发生在哪里?
to/from JSON API 是在服务端转换好还是在客户端转换更好?
第一个问题确实是一个偏好问题。我个人更喜欢让服务器发出并接受 JSON API 格式,因为它允许您向客户端发送更少的 JavaScript 行,并且有多个客户端与同一服务器通信的趋势,因此标准化可以加快客户端应用程序的开发。
例如,您可能有两个 Ember 客户端(一个面向一般用户,一个面向管理员),一个 iOS 客户端,也许还有另一个服务器都向您的 PostgREST 服务器发出请求。
也就是说,您还可以将 PostgREST 使用的格式视为自己的规范,并让所有客户端都遵守该格式。
如果在客户端进行转换,转换to/fromJSONAPI发生在哪里?
这让我们想到了问题 2:如何让 Ember 数据与不使用 JSON API 标准的服务器进行通信?
这发生在两个地方:Adapter and the Serializer。
适配器将数据请求转换为可以找到(或添加)数据的适当 URL 并发起请求。
因此,"give me the photo with the ID of 22" (store.find('photo', 2)
) 将询问适配器(假设照片 #2 尚未加载),"hey, someone wants Photo #2, go fetch it please"。
适配器将发出请求并将响应移交给它的序列化程序。
Serializer 负责将返回的数据转换为 Ember 数据可以理解的格式:JSON API.
Adapter 和 Serializer 都有可以实现的方法来自定义它们的行为。
在您使用 PostgREST 的情况下,最好的起点是在 Serializer 上实现您自己的 findRecord
on the Adapter and implementing your own normalizeResponse
。
两者的文档都解释了您需要采取的操作以及您应该从每种方法return获得什么类型的值。
这是两个最基本的界面。它们没有提供很多开箱即用的功能,但会帮助您熟悉这两个对象的交互方式。
一旦您对这种基本交互感到满意,请查看示例 RestAdapter and RestSerializer,了解有关如何依赖适配器和序列化程序必须提供的一些约定来清理您拥有的任何自定义代码的想法书面。
ember-data 原生理解 json-api,如果我们必须将 ember-data 及其 save() 和 find() 方法与 postgrest 风格的 REST 调用集成,我们需要在哪里做变化 ?
我们是否需要修改 ember 中的客户端或某些服务器端逻辑以根据 ember-data 要求进行映射。
所以 postgrest REST api 调用看起来像这些来获取电影及其标题和 competition.name 来自相关 table ->
http://localhost:3001/film?select=title,competition{name}
http://localhost:3001/users?select=email::text&id=eq.2&sign_in_count=eq.16
这里有两个问题:
- to/from JSON API 是在服务端转换好还是在客户端转换更好?
- 如果在客户端进行转换,转换 to/from JSON API 发生在哪里?
to/from JSON API 是在服务端转换好还是在客户端转换更好?
第一个问题确实是一个偏好问题。我个人更喜欢让服务器发出并接受 JSON API 格式,因为它允许您向客户端发送更少的 JavaScript 行,并且有多个客户端与同一服务器通信的趋势,因此标准化可以加快客户端应用程序的开发。
例如,您可能有两个 Ember 客户端(一个面向一般用户,一个面向管理员),一个 iOS 客户端,也许还有另一个服务器都向您的 PostgREST 服务器发出请求。
也就是说,您还可以将 PostgREST 使用的格式视为自己的规范,并让所有客户端都遵守该格式。
如果在客户端进行转换,转换to/fromJSONAPI发生在哪里?
这让我们想到了问题 2:如何让 Ember 数据与不使用 JSON API 标准的服务器进行通信?
这发生在两个地方:Adapter and the Serializer。
适配器将数据请求转换为可以找到(或添加)数据的适当 URL 并发起请求。
因此,"give me the photo with the ID of 22" (store.find('photo', 2)
) 将询问适配器(假设照片 #2 尚未加载),"hey, someone wants Photo #2, go fetch it please"。
适配器将发出请求并将响应移交给它的序列化程序。
Serializer 负责将返回的数据转换为 Ember 数据可以理解的格式:JSON API.
Adapter 和 Serializer 都有可以实现的方法来自定义它们的行为。
在您使用 PostgREST 的情况下,最好的起点是在 Serializer 上实现您自己的 findRecord
on the Adapter and implementing your own normalizeResponse
。
两者的文档都解释了您需要采取的操作以及您应该从每种方法return获得什么类型的值。
这是两个最基本的界面。它们没有提供很多开箱即用的功能,但会帮助您熟悉这两个对象的交互方式。
一旦您对这种基本交互感到满意,请查看示例 RestAdapter and RestSerializer,了解有关如何依赖适配器和序列化程序必须提供的一些约定来清理您拥有的任何自定义代码的想法书面。