|
RESTful 什么是编程?0 A0 Q' p7 {& Y: Z9 C. v- O/ ~
- d3 m6 }$ f. e 解决方案:
/ |* V$ w% z! l0 H REST是 Web 底层结构原则。Web令人惊讶的是,客户端(浏览器)可以以复杂的方式与服务器交互,而客户端不需要事先了解服务器及其托管资源。关键约束是服务器和客户端必须就所使用的媒体达成协议Web 的情况是HTML。
2 I4 H( g, `2 H2 b) t. c/ M' h9 x遵循REST原则的 API客户端不需要了解 API 结构。相反,服务器需要提供客户端与服务互动所需的任何信息。HTML表格就是这样一个例子:服务器指定资源和所需字段的位置。浏览器不知道在哪里提前提交信息,也不知道提前提交什么信息。服务器完全提供两种信息。(这个原理叫HATEOAS : Hypermedia As The Engine Of Application State。)
* R5 k: q* m( {# S那么,如何应用这个呢?HTTP,如何在实践中实现?HTTP以动词和资源为导向。主流用法中的两个动词是GETand POST,我想大家都知道。HTTP标准定义了其他几个标准,例如PUT和DELETE。然后根据服务器提供的指令将这些动词应用于资源。$ V4 m3 l) g" S$ |3 O/ I' S% x
例如,假设我们有 Web 服务管理用户数据库。我们的服务是基于 JSON 自定义超媒体,我们分配 mimetype application/json userdb(也可能有一个application/xml userdb和application/whatever userdb-可能支持多种媒体类型)。客户端和服务器都被编程来理解,但他们对彼此一无所知。正如罗伊菲尔丁所指出的:
$ n8 v9 ?' Q1 g4 k" JREST API 几乎所有的描述性工作都应该用来定义用于表示资源和驱动应用程序状态的媒体类型,或者定义扩展关系名称和/或现有标准媒体类型的超文本启用标志。
0 G7 P4 C7 C; A2 P Z; J9 ]要求基础资源/可返回以下内容:* n, {) ~) ?5 H6 ^" s/ }- |8 W
要求
6 {+ _' Z4 X$ c& V! Y: X/ B6 NGET /Accept: application/json userdb回复
; n B, i8 ]! g O; v9 ?# j200 OKContent-Type: application/json userdb{ "version": "1.0", "links": "href": "/user", "rel": "list", "method": "GET" "href": "/user", "rel": "create", "method": "OST" 我们从媒体的描述中知道,我们可以从被称为链接的部分中找到相关资源的信息。这被称为超级媒体控制器。在这种情况下,我们可以从这些部分了解到,我们可以通过发送另一个请求来找到用户列表/user:: _/ D8 D2 r v4 S
要求
5 }6 t% ^6 w$ p: O% ^* I MGET /userAccept: application/json userdb回复/ k( C, m( ]5 c+ k8 M9 L
200 OKContent-Type: application/json userdb{ "users": "id": 1、 "name": "Emil", "country: "Sweden", "links": "href": "/user/1", "rel": "self", "method": "GET" "href": "/user/1", "rel": "edit", "method": "UT" }, "href": "/user/1", "rel": "delete", "method": "DELETE" "id": 2、 "name": "Adam", "country: "Scotland", "links": [ "href": "/user/2", "rel": "self", "method": "GET" }, "href": "/user/2", "rel": "edit", "method": "UT" "href": "/user/2", "rel": "delete", "method": "DELETE" "links": "href": "/user", "rel": "create", "method": "OST" 我们可以从这个回应中看到很多。例如,我们现在知道我们可以通过POSTing 创建新用户/user:
7 w4 R6 k7 ^3 E3 n2 e- u6 O要求& i; \) Y9 C9 `. F
POST /userAccept: application/json userdbContent-Type: application/json userdb{ "name": "Karl", "country": "Austria"}回复" k8 c1 h9 S7 g$ R
201 CreatedContent-Type: application/json userdb{ "user": "id": 3、 "name": "Karl", "country": "Austria", "links": [ "href": "/user/3", "rel": "self", "method": "GET" }, "href": "/user/3", "method": "GET" "method": "GET" }}我们也知道我们可以更改现有数据:
7 C8 k, e7 a: P3 q# T要求1 M7 q# ~( ?0 ~
PUT /user/1Accept: application/json userdbContent-Type: application/json userdb{ "name": "Emil", "country": "Bhutan"}回复5 x; U5 S9 ^( @4 l) W2 @
200 OKContent-Type: application/json userdb{ "user": "id": 1、 "name": "Emil", "country": "Bhutan", "links": [ "href": "/user/1", "rel": "self", "method": "GET" }, "href": "/user/1", "rel": "edit", "method": "UT" "href": "/user/1", "rel": "delete", "method": "DELETE" "links": "href": "/user", "rel": "list", "method": "GET" }}请注意,我们使用不同的方法HTTP动词(GET,PUT,POST,DELETE等)来操纵这些资源,我们假设只有知识是我们媒体对客户端的定义。 |
|