7.9 Models -- Connection to An HTTP Server

一、概述

1. 如果你的Ember应用程序需要从一个HTTP服务器加载JSON数据,在你的服务器返回的任何格式中,配置Ember Data的过程将会加载records。

2. store使用一个被称为adapter的对象去了解如何与网络通信。默认的,store将会使用DS.RESTAdapter,它是一个adapter,它通过转换经由XHR的JSON与一个HTTP服务器通信。

3. 这节的内容被分为两部分。第一部分涵盖了一个适配器的默认行为,包括请求records将访问哪些URLS和期望返回什么格式的JSON。

4. 第二部分涵盖了如何重写这些默认的设置去自定义一些事情,例如哪些URLs数据被请求和JSON数据是如何被组织的。

二、URL Conventions

1. 这个REST适配器使用model的名字来确定什么URL发送JSON。

例如,如果你通过一个ID请求一条photo record

app/routes/photo.js

export default Ember.Route.extend({
  model: function(params) {
    return this.store.findRecord('photo', params.photo_id);
  }
});

这个REST适配器将会自动发送一个GET请求到/photos/1
2. 你可以采取的action,在REST适配器中,映射到下面的URL:

ActionHTTP VerbURL
Find Record GET /posts/123
Find All GET /posts
Update PUT /posts/123
Create POST /posts
Delete DELETE /posts/123

三、JSON Conventions

假定如下models:

app/models/post.js

import DS from 'ember-data';

export default DS.Model.extend({
  title:    DS.attr(),
  comments: DS.hasMany('comment'),
  user:     DS.belongsTo('user')
});

app/models/comment.js

import DS from 'ember-data';

export default DS.Model.extend({
  body: DS.attr()
});

Ember Data期望一个到/posts/1Get请求将会返回如下格式的JSON:

{
  "post": {
    "id": 1,
    "title": "Rails is omakase",
    "comments": ["1", "2"],
    "user" : "dhh"
  },

  "comments": [{
    "id": "1",
    "body": "Rails is unagi"
  }, {
    "id": "2",
    "body": "Omakase O_o"
  }]
}

四、Customizing the adapter

1. 为了 自定义这个REST适配器,创建一个app/adapters/application.js文件并且导出一个DS.RESTAdapter的子类。然后你可以重写它的属性和方法来自定义records是如何被检索和保存的。

app/adapters/application.js

export default DS.RESTAdapter.extend({
  ...
});

2. Customizing a specific model

完全有可能,你需要为一个model定义options,而不是一个应用程序范围的自定义。在这种情况下,你可以创建一个以指定的模型命名的适配器。

app/adapters/post.js

export default DS.RESTAdapter.extend({
  namespace: 'api/v2',
  host: 'https://api.example2.com'
});

app/adapters/photo.js

export default DS.RESTAdapter.extend({
  namespace: 'api/v1',
  host: 'https://api.example.com'
});

这允许你轻松链接到多个API版本,同时在每一个模型的基础上与不同的域进行交互。

五、Customizing URLS

1. URL Prefix

如果你的JSON API在其他地方而不是在host root,你可以设置一个前缀,它可以被添加到所有的请求。例如,如果你正在使用一个JSON API,一个请求特殊的person可能会访问/api/v1/people/1。在这种情况下,设置namespace属性为api/v1

app/adapters/application.js

export default DS.RESTAdapter.extend({
  namespace: 'api/v1'
});

用ID为1请求一个person现在将会访问到/api/v1/people/1

2. URL Host

如果你的JSON API运行在服务于你的Ember app不同的域上而不是一个,你可以改变host用来发送HTTP请求。

注意为了使它有效,你需要使用一个支持 CORS(跨域访问)的浏览器,并且你的服务器需要被配置去发送正确的CORS头。

为了改变这个请求被发送到的host,设置host属性:

app/adapters/application.js

export default DS.RESTAdapter.extend({
  host: 'https://api.example.com'
});

使用ID为1请求一个person,现在将会导航到https://api.example.com/people/1

3. Custom HTTP Headers

一些APIs请求HTTP头,例如,提供一个API key。任意头可以被设定为key/value对,在RESTAdapterheaders属性中并且Ember Data将会随着每一次ajax请求发送它们。

例如:

app/adapters/application.js

export default DS.RESTAdapter.extend({
  headers: {
    'API_KEY': 'secret key',
    'ANOTHER_HEADER': 'Some header value'
  }
});

请求任何资源将会包括下面的HTTP头:

ANOTHER_HEADER: Some header value
API_KEY: secret key
posted @ 2016-02-01 18:03  鱼不吐泡泡  阅读(309)  评论(0编辑  收藏  举报