RESTful Web Services

Programmable Web 及其分类

programmable web 是基于HTTP和XML技术。

  • 虽然HTML、JSON、纯文本、二进制也在使用,但采用较多的还是XML。
  • 基于HTTP

HTTP:信封里的文档

HTTP是一中基于文档的协议。客户端把文档放在信封里,发给服务器;作为回应,服务器把响应文档放在信封里,发给客户端。

HTTP对信封格式有严格的标准,但它并不关心信封里的内容。

HTTP请求的各个主要部分:

  • HTTP方法( HTTP method)
  • 路径(path)
  • 请求报头(request headers)
  • 实体主体(entity-body),也称文档(document)或表示(representation)

HTTP响应代码

  • 响应报头(response headers)
  • 实体

作用域信息

Web技术基础:HTTP应用协议、URL命名标准、XML标记语言

Web设计原则(REST):表示性状态转移(Representation State Transfer)

ROA:面向资源架构(Resource-Oriented Architecture)

RESTful web services:REST式Web服务

HTTP方法(HTTP method):GET 获取、HEAD、PUT 改写、DELETE 删除、POST

路径(path):URI里主机名(hostname)后面的部分

请求报头(request headers):是一组键值对(key-value pairs),起元数据的(metadata)作用。有8个报头:Host、User-Agent、Accept、Content-Type

实体主体(entity-body):

相互竞争的架构

RPC式架构:方法信息和作用域信息都在信封(envelop)或报头(headers)里。通常从客户端收到一个充满数据的信封,然后发回一个同样充满数据的信封。

REST式、面向资源的架构:REST架构意味,方法信息(method information)都在HTTP方法里;ROA意味,作用域(scoping information)都在URI里。

WS-*

这些标准定义各种特定用途的SOAP报头

WSDL(Web Service Description Language,Web 服务描述语言):用于描述SOAP Web服务的XML词汇。

WADL(Web Application Description Language,Web 应用描述语言):用于描述REST Web服务的XML词汇。

面向资源的架构

REST是一种设计原则。

REST式架构-面向资源的架构(Resource-Oriented Architecture,ROA)。

ROA是一种把实际问题转换成REST式Web服务的方法:它令URI、HTTP和XML具有和其他Web应用一样的工作方式。

ROA特性:

  • 可寻址性(addressability)
  • 无状态性(statelessness)
  • 连通性(connectedness)
  • 统一接口(uniform interface)

URIs

  • URI应具有描述性

  • URI跟资源的关系

  • 任何两个资源都不可能是同一个

  • 两个不同的资源在某一时刻可能指向同一个数据。

  • 可寻址性

  • 无状态性

  • 每个HTTP请求都是完全孤立的。当客户端发出一个HTTP请求时,请求里包含服务器实现该请求的全部信息。

  • 无状态的特性,在负载均衡(load-balanced)服务器上分配无状态的应用将容易许多:请求之间没有没有相互依赖,要提升规模只需往负载均衡系统中添置更多的服务器即可。

  • 对无状态的应用缓存也比较容易。

  • 改变无状态性,最常用的方法是利用HTTP会话(session)。当用户首次访问网站时,会得到一个唯一的字符串,用以标识在该网站上的会话。这个标识是服务器端某个数据结构中的key,通过这个key,可以在服务器端查到请求的状态信息。

  • 状态分为两种:应用状态和资源状态,前者应该保存在客户端,后者应该保存在服务端。

  • 表示

  • 资源是表示的来源,表示只是资源当前状态的一些数据。

  • 当一个资源有多个表示时,推荐为一个资源的多个表示设置不同的URI。例如:同一个文章不同语言的表示。

  • 通过设置Accept可以指定表示的首先格式。例如:Accept-Language。但尽量将更多的信息放在URI里。

  • 连接与连通性

  • 表示可以是系列化的数据结构

  • 大多数的REST式服务里表示是超媒体,也就是说文档中不仅包含数据(data),还包含指向其他资源的链接。

  • 统一接口

HTTP四种基本方法:

  1. 获取资源的一个表示 HTTP GET
  2. 创建一个新资源:向新的 URI 发送 HTTP PUT ,或向一个 URI 发送 HTTP POST
  3. 修改已有的资源:向已有的 URI 发送 HTTP PUT
  4. 删除已有资源: HTTP DELETE

其他:

  1. 获取一个只包含元数据的表示: HTTP HEAD 。HEAD请求就是比GET请求少返回实体主体而已。
  2. 查看一个资源支持哪些HTTP方法: HTTP OPTIONS

POST与PUT

在一个REST式设计中,POST通常被用于创建从属资源。

PUT与POST的区别在于:假如是客户端负责决定新资源采用什么URI,就用PUT;假如服务器负责新资源采用什么URI,就用POST。

PUT和POST动作

向新资源发PUT请求 向已有资源发PUT请求 POST
/weblogs N/A(资源已存在) 无效果 创建一个新的博客
/weblogs/myweblog 创建该博客 修改该博客的设置 往博客里添加一篇文章
/weblogs/myweblog/entries/ N/A(无法知道这个URI) 编辑该博客文章 为该博客文章添加评论

安全性和等幂性

GET和HEAD请求应是安全的。

GET、HEAD、PUT、DELETE请求应是等幂的。等幂性实践要求是:不要允许客户端对资源做相对的改动。

设计只读的面向资源服务

  1. 规划数据集
  2. 把数据集划分为资源
  3. 用URI为该资源命名
  4. 设计发给客户端的表示
  5. 用超链接和表单把该资源与已有的资源联系起来
  6. 考虑有哪些典型的事件经过
  7. 考虑可能出现哪些错误情况

把数据作为HTTP资源来发布:

  • 一个资源就是任何值得作为超链接的目标事物。
  • 成为REST式网站,其资源的命名是有意义的,其资源的表示是整齐有序、且可以通过HTTP GET 来访问的。
  • 整齐有序的表示易于被解析和屏幕抓取。有意义的命名,令资源易于被程序引用。
  • 一个资源是某个事物,用面向对象的方法来设计资源。
  • 一个资源只暴露一个统一的接口,最多支持六中HTTP方法,这些方法只允许创建(PUT或POST)、修改(PUT)、读取(GET)和删除(DELETE)这些最基本的操作。如果需要,可以通过重载POST来扩展接口,把一个资源变成一个小型RPC式消息处理器

服务暴露的资源可分为三类:

  1. 为特别目的专门预定义的一次性资源。包括可用资源的最上层目录。大多数服务几乎不暴露一次性资源。例如:桶列表
  2. 服务暴露的每一个对象所对应的资源。
  3. 代表在数据集上执行的算法结果的资源

命名资源:URI设计有三条基本原则

  1. 用路径变量来表达层次结构:/parent/child。
  2. 在路径变量里加上标点符号,消除误解:/parent/child1;child2。建议:当作用域信息的次序有关紧要时,用逗号;否则用分号。
  3. 用查询变量来表达算法的输入:/search?q=jellyfish&start=20

总结:
REST式Web服务通过资源来暴露数据(data)和算法(algorithms)。有关数据的资源常常构成一个层次结构:由很少的资源开始,然后逐渐扩展为具有许多叶节点。

例如:S3桶列表(bucket list)包含各个桶,而各个桶又包含对象。
理解“把算法暴露为资源”,不要从动作方面来考虑,而是从该动作的结果方面来考虑。

设计可读写的面向资源的服务

  1. 规划数据集
  2. 把数据集划分为资源
  3. 用URI为该资源命名
  4. 暴露一个统一接口子集
  5. 设计来自客户端的表示
  6. 设计发给客户端的表示
  7. 用超链接和表单把资源与已有资源联系起来
  8. 考虑有哪些典型的事件经过
  9. 可虑可能出现哪些错误情况

关键点:

  • 认证:把请求跟用户关联起来。

    • 认证方案:
    1. HTTP基本验证(HTTP Basic)。
    2. HTTP摘要认证(HTTP Digest)。
    3. WSSE认证。
  • 授权:确定一个给定用户可以做哪些操作。

  • 保密性:数据要经过一系列的计算机才能最终抵达客户端,需要防止数据不被窃取。通常使用SSL对HTTP进行加密。采用HTTPS可以防止其他计算机窃听客户端与服务器之间的对话。

  • 表单编码:

媒体类型(application/x-www-formurlencoded)。有时被称为"CGI转义"。

  • URI中使用URI-encoding编码,例如:URI.escape
  • 表单中使用form-encoding编码,例如:CGI::escape

REST和ROA最佳实践

  • 安全性和等幂性:

  • GET和HEAD请求应该是安全的。

  • PUT或DELETE请求应该是等幂的。向一个URI发送多次PUT或DELETE请求,应该和只做过一次请求的效果一样。应避免使用PUT请求对资源状态作相对的改动。

  • 新建资源:PUT vs POST

  • 只有当客户端能够自己构造出新的URI时,才能够使用PUT来创建资源。

  • 重载POST

  • 用于为Web浏览器这种不支持PUT和DELETE的客户端模拟HTTP统一接口。

  • 绕过URI的最大长度限制。

  • 需要考虑的问题:

  • 异步操作

  • 批量操作

  • 事物

  • 认证

  • 压缩

  • 缓存

  • Cookies

服务的技术构件表示格式:

  • XHTML(application/xhtml+xml)
  • Atom(application/atom+xml)发布协议
  • SVG(image/svg+xml)
  • 表单编码的 关键字-值对 (application/x-www-form-urlencoded)
  • JSON (application/json)
  • 特定框架的序列化格式(application/xml)

REST式服务框架

  • Ruby on Rails
  • Restlet:建立REST概念的Java类之间的映射
  • Django:方便用Python来开发Web应用和Web服务
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,591评论 18 139
  • 一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式。”但是在要求详细讲述它所提出的各个约束,以及如...
    时待吾阅读 3,408评论 0 19
  • RESTful web servicesare built to work best on the Web. Re...
    _东邪_阅读 1,050评论 0 2
  • API定义规范 本规范设计基于如下使用场景: 请求频率不是非常高:如果产品的使用周期内请求频率非常高,建议使用双通...
    有涯逐无涯阅读 2,517评论 0 6
  • 使用统一接口 HTTP是一种应用层协议,然而,包括SOAP和一些Ajax Web框架在内的不少技术都将HTTP作为...
    daoyidao阅读 468评论 0 1