7.9 Models -- Connection to An HTTP Server

1、概述html

1. 若是你的Ember應用程序須要從一個HTTP服務器加載JSON數據,在你的服務器返回的任何格式中,配置Ember Data的過程將會加載records。html5

2. store使用一個被稱爲adapter的對象去了解如何與網絡通訊。默認的,store將會使用DS.RESTAdapter,它是一個adapter,它經過轉換經由XHR的JSON與一個HTTP服務器通訊。ajax

3. 這節的內容被分爲兩部分。第一部分涵蓋了一個適配器的默認行爲,包括請求records將訪問哪些URLS和指望返回什麼格式的JSON。api

4. 第二部分涵蓋了如何重寫這些默認的設置去自定義一些事情,例如哪些URLs數據被請求和JSON數據是如何被組織的。跨域

2、URL Conventions瀏覽器

1. 這個REST適配器使用model的名字來肯定什麼URL發送JSON。服務器

例如,若是你經過一個ID請求一條photo record網絡

app/routes/photo.jsapp

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

這個REST適配器將會自動發送一個GET請求到/photos/1
2. 你能夠採起的action,在REST適配器中,映射到下面的URL:cors

Action HTTP Verb URL
Find Record GET /posts/123
Find All GET /posts
Update PUT /posts/123
Create POST /posts
Delete DELETE /posts/123

3、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"
  }]
}

4、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版本,同時在每個模型的基礎上與不一樣的域進行交互。

5、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
相關文章
相關標籤/搜索