@
temberature 首先搞清楚什么是 REST 。
InfoQ 上有 Fielding 博士的原始论文的中文翻译版本。
广泛的讲 REST 不限于 HTTP 协议,数据交换格式可以是文本也可以是二进制。狭义的讲,我们通常将 REST 限于 HTTP , JSON 是取常用的数据交换格式, XML 也没问题。
REST 的几个要素:
1. 用一个唯一的 URI 代表资源的定位
2. 用 HTTP 语义( GET , POST , PUT , PATCH , DELETE , HEAD , OPTION 等)操作资源
3. 用 HTTP 状态标志操作结果
常用的 CRUD REST API 可以这样设计:
比如常见的 BLOG 程序,定义一个 /posts 入口。
/posts , GET , 取得所有 POST ,结果是一个 [{},{}]数组,可以接查询参数?page=XXX 等,返回 200 状态。
/posts , POST , 发布新 POST , Request Body 为{title:"text", body:"test body"}, 返回 201 状态。
/posts /{id}, GET , 取得所有单个 POST , URI 需要接 id, 成功返回 200 状态,失败 404 。
/posts /{id} , PUT , 更新 POST , Request Body 为{title:"text", body:"test body"}, 返回 204 状态。
/posts /{id} , DELETE , 删除 POST , 成功 返回 204 状态。
/posts 是对资源集合操作,/posts/{id}对单个资源操作。操作的结果有的有返回数据,更直接的表达结果是 HTTP Status 。
我写的简单的例子,
https://github.com/hantsy/angularjs-springmvc-sample这个例子,目前没写任何 Notes 来描述。
要了解 REST API 实现,可以看另外一个类似的例子
https://github.com/hantsy/angularjs-grails-sample , 这个项目的 WIKI 上的详细介绍。
@
temberature 从 REST API 设计角度,你的问题和 REST 一点关系都没有。从设计上角度,查询数据?a=1 仅适用条件过滤,也就是上面第一个 /posts GET 方式。
另外,关于 REST API 设计好坏,有一个 Rechardson 成熟度模型来衡量。它定义了三个级别。国内几个一线大公司的 API 基本都是 Level 0 , 按这个标准衡量来讲,都不是 REST API ,虽然他们 Developer 网站都喜欢写上 REST 的字样。反而一些不大的公司做得不错,比如 JPUSH 等。
当我们考虑 Level3 ( Self-document, Self-Discovery ) 的时候,在交换格式上就有很多细节要去实现。这方面有一些行业标准或者正在标准化的交换格式。
如: HAL , Collection+JSON , JSON API 。