gpt4 book ai didi

ember.js - RESTful JSON API 与 Ember 一起使用所需的约定

转载 作者:行者123 更新时间:2023-12-02 17:34:10 25 4
gpt4 key购买 nike

在 Ember 中 Models Introduction ,提到:

Without any configuration, Ember Data can load and save records and their relationships served via a RESTful JSON API, provided it follows certain conventions.



我开始尝试使用基于 token 的 RESTful JSON API,乍一看,它并不是严格的 RESTful。几个例子:
  • 身份验证实现为 GET /api/authenticate?email=a@b.com&password=pass
  • 大多数 API 的返回状态为 200(响应 header ),即使在失败时也是如此。返回的 json 包含附加字段 success ( bool 值)和 code (int) 指示 API 是失败还是通过。
  • 网址不是基于名词(模型)。例如,一个典型的消息编辑操作通常应该是一个 POST 到一个 url 像 /api/message/1/edit实现为 GET /api/edit_message?id=1&text=new

  • 所以,我想知道是否有人可以列出这些 certain conventions是在文档中提到的。这可以帮助我了解是否可以使用 ember-data。

    最佳答案

    简短的回答是 EmberData 可能不适合您的 REST API,因为您的 REST API 并不是真正的 REST API(它不使用 HTTP 动词而是将操作作为查询字符串的一部分嵌入)。

    为什么 Ember 数据可能不适合您

    虽然过去 Ember Data 项目的目标可能是支持您所描述的 API,但最近,Ember Data 开发人员明确表示,他们不打算将 Ember Data 用于非- 常规 API。例如,旨在“弥合差距”并允许将 Ember 数据与非常规 REST API 一起使用的 BasicAdapter 已被删除。

    这是 Emberjs.com 上博客文章的实际引用和链接(值得一读):

    "Ember Data will now focus on being the best possible library for Ember.js apps to communicate with consistent, conventional APIs." (http://emberjs.com/blog/2013/05/03/ember-data-progress-update.html)



    按照该博客文章中的建议,您应该查看以下可能更适合您情况的数据持久性库:

    https://github.com/endlessinc/ember-restless

    https://github.com/ebryn/ember-model

    最后,您可以随时使用 AJAX 自己完成,就像 Discourse 的人所做的一样 http://eviltrout.com/2013/03/23/ember-without-data.html

    认证

    据我所知,Ember Data 不处理应用程序身份验证,这就是我认为您在那里的示例所得到的。对于您的身份验证系统,您可以查看 Ember.SimpleAuth ( https://github.com/simplabs/ember-simple-auth ) 之类的内容,它是高度可配置的,应该与您的身份验证机制配合使用(尽管它肯定需要编写自定义身份验证器)。

    编写自定义身份验证器非常简单。

    什么是 Ember 数据实际期望

    如果您还没有看过此页面,我建议您阅读一下: http://emberjs.com/guides/models/the-rest-adapter/

    Ember Data 将使用 HTTP 动词来传达意图。因此,当您在其中一个模型上调用 createRecord 并保存存储时,Ember Data 将向您的 REST API 发出 HTTP POST。当您尝试获取记录时,Ember 将发出 GET 请求。当您尝试删除记录时,Ember 将发出 DELETE 请求(等等)。

    假设您有三个看起来像这样的模型:
    module.exports = App.ShoppingCart = DS.Model.extend({
    user: DS.belongsTo('user'),
    items: DS.hasMany('item', {async:true}),
    name: attr('string'),
    enabled: attr('boolean')
    });

    module.exports = App.Item = DS.Model.extend({
    name: attr('string')
    });

    module.exports = App.User = DS.Model.extend({
    firstName: attr('string')
    lastName: attr('string')
    });

    当您尝试使用 this.store.find('shoppingCart', 1) 加载记录时Ember 将对模型名称的复数形式(在本例中为 GET /shoppingCarts/1 )发出 GET 请求。 Ember 内置了一堆规则来确定单词的复数形式,例如它知道 search 的复数形式。是 searches而不是 searchs .发出 GET 请求后,您的 REST API 需要返回以下 JSON:
    {
    "shoppingCart": {
    "id": 1,
    "name": "Bobs Shopping Cart",
    "user": 1, //this field links to the user with an id of 1
    "enabled": true,
    "items": [
    1,
    2
    ]
    }
    }

    如果你在做 this.store.find('shoppingCart')然后 Ember Data 将发出 GET /shoppingCarts并期望返回以模型名称的复数形式键入的购物车对象数组。例如,像这样:
    {
    "shoppingCarts": [
    {
    "id": 1, //not specified in the model but must be sent by the REST API
    "name": "Bob's Shopping Cart",
    "user": 1, //this field links to the user with an id of 1
    "enabled": true,
    "items": [
    1,
    2
    ]
    },
    {
    "id": 2,
    "name": "John's Shopping Cart",
    "user": 2, //this field links to the user with an id of 2
    "enabled": false,
    "items": [
    3, // these are ids for the item models
    4
    ]
    }
    ]
    }

    请注意,当您从服务器返回记录时,您需要包含一个 id唯一标识要返回的记录的字段。模型本身未指定 id 字段。当您创建新记录并将数据发送到服务器时,您不包含 id 字段(因为它将由服务器端确定),但 REST API 需要返回响应中的 id 。

    在上面的例子中,如果 Ember Data 在存储中缓存了用户“1”,那么它只会使用该信息,否则它将向 GET /users/1 发出另一个 GET 请求。检索用户 1 的信息。(如果您想避免多个 GET 请求,您可以通过旁加载记录来提高效率)。

    总而言之,约定是使用 HTTP 动词来传达应该采取什么操作,Ember Data 将请求发送到的 URL 是基于您正在查询的模型名称的复数形式。

    大警告

    我上面写的大部分内容都是基于这样一个假设,即您希望“开箱即用”地使用 Ember Data,而无需进行过多的定制。一般来说,我认为当您可以控制 REST API 并且可以调整它以符合 Ember Data 关于基于 JSON 的 REST API 应该如何工作的意见时,Ember Data 最容易使用。可以更改 Ember Data 的默认行为,但我对尝试弯曲 Ember Data 以适应我的 API 的经验不是很丰富,因此您可能需要尝试这样做的其他人的一些输入。

    关于ember.js - RESTful JSON API 与 Ember 一起使用所需的约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21964664/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com