REST(REpresentational State Transfer)Web 是一种轻量级的服务模式,通常用于构建 Web API,例如国外的 Skydrive,Dropbox,Twitter,国内的新浪微博等,都利用这种方式来提供第三方的服务接口。

REST Web API 经常使用 http 或者 https 传输协议,我们可以看看 Dropbox 的 REST API 的例子:

GET  https://api.dropbox.com/1/account/info
GET  https://api.dropbox.com/1/metadata/sandbox/hello.txt
GET  https://api-content.dropbox.com/1/files/sandbox/hello.txt
POST https://api-content.dropbox.com/1/files/sandbox/hello.txt
PUT  https://api-content.dropbox.com/1/files_put/sandbox/hello.txt?param=val

可以看出,REST API 首先有一些 URI 地址,惟一的对应每一个资源,然后用 GET,POST,PUT 等方法来表示对某个资源读取,创建和修改等操作。

客户端和服务器之间还需要有确定数据格式,最常用的是 JSON(JavaScript Object Notation)格式。JSON 定义的数据结构是 JavaScript 数据结构的一个子集,容易阅读和编写,在其它语言中也很方便使用。例如:

{
    "bytes": 0,
    "path": "/Public",
    "is_dir": true,
    "contents": [
        {
            "size": "0 bytes",
            "bytes": 0,
            "path": "/Public/latest.txt",
            "is_dir": false
        },
        {
            "size": "0 bytes",
            "bytes": 0,
            "path": "/Public/history.txt",
            "is_dir": false
        }
    ],
    "revision": 29007
}

可以看到, JSON 的语法和 JavaScript 的非常类似,需要注意的地方主要有:字符串只能用双引号,而对象的属性名必须用引号包含。

JavaScript 中的 JSON 对象只有两个方法:JSON.parse 和 JSON.stringify。JSON.parse 方法 将一个 JSON 字符串转化为 JavaScript 对象,而 JSON.stringify 方法将 JavaScript 对象转化为 JSON 字符串。由于 JavaScript 对象可能包含循环结构,因此 JSON.stringify(value, replacer, space) 方法包含一个 replacer 参数,用于选择性的转化 JavaScript 对象。例如:

function replacer(key, value) {
    var omits = ['parent', 'previous', 'next'];
    if (omits.indexOf(key) == -1) return value;
}

JSON.stringify(posts, replacer, 4);

上面的例子中,JSON.stringify 转换时将忽略 posts 对象及其子对象中的名称为 'parent','previous','next' 的属性。最后一个参数表示用 4 个空格缩进转换的结果。