本文内容接上篇博客内容
与服务端交换数据
Backbone模型最后可用的功能集合是与如何从一个提供REST API的服务端读取数据,或将数据发送至该服务端相关。在开始接触Backbone的这个相关机制前,我们首先设置一个简单的后端用以为我们的API调用提供响应。
Node.js服务端后台
既然我们使用了JavaScript,我将概述一下使用Node.js的一个简单的服务端,但你也可以根据你的选择轻松地换成其他REST服务端的实现。由于本书的重点在于客户端,因此我们不会深入地讨论服务端的实现。然而,对于解释如何响应Backbone应用的请求这一目的来说已经够用了。
首先需要从http://nodejs.org上安装Node.js。安装完后,使用NPM包管理器安装express node包,其是一个很小的用于Node.js的web应用框架,通过它可以轻松地运行一个具有REST API的简单服务端。
npm install express
最后,只需将以下代码拷贝到 server.js 中。从代码中可以看到,它通过http://localhost:8080/books提供了一些简单的端点服务。
/**
* 由localhost:8080/books提供的简单API
*/
var express = require('express');
var app = express();
var bookId = 100;
function findBook(id){
for(var i = 0; i < books.length; i++){
if(books[i].id === id){
return books[i];
}
}
return null;
}
function removeBook(id){
var bookIndex = 0;
for(var i = 0; i < books.length; i++){
if(books[i].id === id){
bookIndex = i;
}
}
books.splice(bookIndex, 1);
}
app.configure(function(){
//解析由body request提供的JSON对象
app.use(express.bodyParser());
});
var books = [
{id: 98, author: 'Stephen King', title: 'The Shining', year: 1977},
{id: 99, author: 'George Orwell', title: 1949}
];
/**
* HTTP GET /books
* 应该返回一个books的列表
*/
app.get('/books', function(request, response){
response.header('Access-Control-Allow-Origin', '*');
console.log('In GET function');
response.json(books);
});
/**
* HTTP GET /books/:id
* id是你想获取的那本书的唯一标识符
* 应该返回具有指定id的任务,不然的话就是404
*/
app.get('/books/:id', function(request, response){
response.header('Access-Control-Allow-Origin', '*');
console.log('Getting a book with id ' + request.paras.id);
var book = findBook(parseInt(request.params.id, 10));
if(book === null){
response.send(404);
}else{
response.json(book);
}
});
/**
* HTTP POST /books/
* 请求的主体包含了创建的book
* 若成功则返回200
*/
app.post('/books/', function(request, response){
response.header('Access-Control-Allow-Origin', '*');
var book = request.body;
console.log('Saving book with the following structure ' + JSON.stringify(book));
book.id = bookId++;
books.push(book);
response.send(book);
});
/**
* HTTP PUT /books/
* id是你想更新的那本书的唯一标识
* 如果具有该id的书不存在则返回404
*/
app.put('/books/:id', function(request, response){
response.header('Access-Control-Allow-Origin', '*');
var book = request.body;
console.log('Updating Book ' + JSON.stringify(book));
var currentBook = findBook(parseInt(request.params.id, 10));
if(currentBook === null){
response.send(404);
}else{
//本地存储book
currentBook.title = book.title;
currentBook.year = book.year;
currentBook.author = book.author;
response.send(book);
}
});
/**
* HTTP DELETE /books/
* id是你想删除的那本书的唯一标识
* 如果具有指定id的那本书不存在则返回404
*/
app.delete('/books/:id', function(request, response){
console.log('calling delete');
response.header('Access-Control-Allow-Origin', '*');
var book = findBook(parseInt(request.params.id, 10));
if(book === null){
console.log('Could not find book');
response.send(404);
}else{
console.log('Deleting ' + request.params.id);
removeBook(parseInt(request.params.id, 10));
response.send(200);
}
response.send(200);
});
//为允许CORS请求追加设置
var allowCrossDomain = function(req, response, next){
response.header('Access-Control-Allow-Origin', 'http://localhost');
response.header('Access-Control-Allow-Methods', 'OPTIONS, GET, PUT, POST, DELETE');
response.header('Access-Control-Allow-Headers', 'Content-Type');
if('OPTIONS' == req.method){
response.send(200);
}else{
next();
}
};
app.configure(function(){
app.use(allowCrossDomain);
});
//设置app的端口号为8080
app.listen(8080);
在命令行中输入node server.js以启动服务器。这个服务器虽然非常简单,但对于Backbone的持久性调用的正确执行来说已经足够了。
本篇内容翻译自《Beginning Backbone.js》,原著作者James Sugrue。