REST风格的JSON API可以与Ember一起使用

在Ember模型介绍中提到:

在没有任何配置的情况下,Ember Data可以通过RESTful JSON API加载并保存记录及其关系,前提是它遵循特定的约定。

我开始尝试使用基于令牌的RESTful JSON API,乍看起来并不严格RESTful。 几个例子:

  • 身份验证实现为GET /api/authenticate?email=a@b.com&password=pass
  • 即使在失败时,大部分API的返回状态都为200(响应头)。 返回的json包含success (boolean)和code (int)的附加字段,指示API是否失败或传递。
  • 这些网址并非基于名词(模型)。 例如,一个典型的消息编辑操作,通常应该是一个像/api/message/1/edit这样的url的POST,被实现为GET /api/edit_message?id=1&text=new
  • 所以,我想知道是否有人可以列出这些文档中提到的certain conventions 。 这可以帮助我理解我是否可以使用ember-data。


    最简单的答案是EmberData可能不适合您的REST API,因为您的REST API实际上不是一个静态API(它不使用HTTP动词,而是将操作作为查询字符串的一部分嵌入)。

    为什么安装数据可能不适合你

    尽管过去Ember Data项目的目标可能是支持API,例如您正在描述的API,但最近,Ember Data开发人员明确表示,他们不打算将Ember Data与非 - 传统的API。 例如,旨在“缩小差距”并允许在非常规REST API中使用Ember数据的BasicAdapter已被删除。

    这里是Emberjs.com上的博文的实际报价和链接(值得一读):

    “Ember Data现在将专注于成为Ember.js应用程序与一致的传统API进行通信的最佳库。” (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自己做,就像话语人们http://eviltrout.com/2013/03/23/ember-without-data.html

    认证

    据我所知,Ember Data不处理应用程序认证,这是我认为你在那里得到的例子。 对于你的认证系统,你可以看看像Ember.SimpleAuth(https://github.com/simplabs/ember-simple-auth)这是高度可配置的,应该与你的认证机制一起工作(尽管它肯定会要求编写一个定制认证)。

    编写一个自定义的Authenticator非常简单。

    什么是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)加载记录时this.store.find('shoppingCart', 1) Ember将对模型名称的复数形式(在本例中为GET /shoppingCarts/1 )发出GET请求。 Ember有一些内置的规则来确定一个单词的复数形式,例如它知道复数的searchsearches而不是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并期望返回一个购物车对象的数组,该数组以模型名称的复数形式为this.store.find('shoppingCart') 。 例如,像这样:

    {
      "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“开箱即用”。 一般来说,我认为Ember Data最容易使用,当你控制REST API并且可以调整它以符合Ember Data对基于JSON的REST API应该如何工作的看法。 可以更改Ember Data的默认行为,但我并不是非常有经验的尝试弯曲Ember Data以适合我的API,因此您可能需要其他人尝试执行此操作的一些输入。

    链接地址: http://www.djcxy.com/p/90955.html

    上一篇: Conventions required of RESTful JSON API to be usable with Ember

    下一篇: server updates when using Ember Data RestAdapter