REST架构风格的服务(或者它开放的api),属于Programmable Web。研究REST 架构风格,要从Programmable Web说起。
Programmable Web一词来源于《Restful Web Services》,我觉得凭字面意思理解就好了。所谓的Programmable Web,可以理解为网站的内容源自服务器的资源,服务器上的所有资源都能够以某种方式提供给客户端,客户端的网站可以根据自己的需求设计每个页面,以及页面中可以显示的服务器端资源。从Programmable Web角度看,twitter是对twitter api编程产生的一个产品;新浪微博的官方网站,第三方客户端和应用等也都是基于新浪微博api编程产生的一系列的产品。
组成部分
Programmable Web主要由三部分组成:HTTP,Method Information(方法信息)和作用域(Scoping Information)。
HTTP
我们谈论的是web,web上少不了http。(http详情可以参考wikipedia)
对于Programmable Web而言,客户端要获得服务器上的资源,需要发起一个http request,服务器接收客户端的请求并作出反馈会给客户端发送一个http response,http request和http response都要封装到envelope中传输
http request的主要组成
-
http method
如GET
,POST
,这些又被称为http动词,用于指示客户端期望服务器如何处理http request -
path
URI中的hostname右边的部分,如 http://essay.igevin.info/2013/05/01/how-pm-know-tech.html 中的2013/05/01/how-pm-know-tech.html
-
request header
request header是以 key:value(键值对) 形式描述的元数据信息(metadata)。HTTP协议中定义了一些标准的header,我们也可以添加自定义的http header -
entity-body
envelope中的信息正文。entity-body可以为空,如GET请求,不需要entity-body中的信息
http response的主要组成
-
http response code
response code告诉客户端向服务器请求的结果是成功,失败或者其他情况,如200
表示成功,301
表示永久的重定向,404
表示not found…… 详情请看这里 -
response header
与上面相同 -
entity body or representation
与上面相同。值得一提的是,这里的内容是贴有“标签”的(标签的内容会放在response header的元数据content-type
中)。这些标签会告诉浏览器如何处理这些response信息。例如,如果在content-type
中指明类型为text/html
,则浏览器会将这里的response信息解析为html文档,并渲染为web页面。常用的http content type 可以参考这个页面
现在不同的web service在设计与实现时,对两个问题的解决差别很大,分别为如何传递 『Method Information』以及如何表达『Scoping Information』
Method Information
Method表达的是,客户端如何向服务器传达自己请求的操作是什么(create, delete, update or read?),或者服务器暴露出来的api对数据或者请求做怎样的处理。
REST 架构风格利用HTTP method作为Method Information的载体。
Scoping Information
Scoping information表达了数据的选择。服务器应该对哪个数据集执行客户端的请求操作?为什么服务器要update(or get, delete, etc.)这个数据集,而不去update那个数据集?这些都是由Scoping information决定的。
有些web service 会将Scoping Information封装到请求的envelope中,而RESTful架构风格直接将该信息暴露在url中。
最后
本文介绍了Programming Web的三个主要组成部分: http, method 和scope。由于不同的web service对method information和 scoping information的处理方式不同,架构风格可以分为 RESTful, RPC-Style及REST-RPC混合架构,这些架构有何不同,这里先挖个坑,后面填上~
图片来源于网站 programming web(PS:与本文的『programming web』不是一回事 :P)
网友评论