REST风格的原则

一个好的RESTful API,应该具备以下特征:

  1. 这个API应该是对浏览器友好的,能够很好地融入Web,而不是与Web格格不入。

    浏览器是最常见和最通用的REST客户端。好的RESTful API应该能够使用浏览器+HTML完成所有的测试(不需要使用编程语言)。这样的API还可以很方便地使用各种自动化的Web功能测试、性能测试工具来 做测试。Web前端应用(基于浏览器的RIA应用、移动App等等)也可以很方便地将多个RESTful API的功能组合起来,建造Mashup类的应用。

  2. 这个API中所包含的资源和对于资源的操作,应该是直观和容易理解的,并且符合HTTP协议的要求。

    REST开发又被称作“面向资源的开发”,这说明对于资源的抽象,是设计RESTful API的核心内容。RESTful API建模的过程与面向对象建模类似,是以名词为核心的。这些名词就是资源,任何可命名的抽象概念都可以定义为一个资源。而HTTP协议并不是一种传输协 议,它实际提供了一个操作资源的统一接口。对于资源的任何操作,都应该映射到HTTP的几个有限的方法(常用的有GET/POST/PUT/DELETE 四个方法,还有不常用的PATCH/HEAD/OPTIONS方法)上面。所以RESTful API建模的过程,可以看作是具有统一接口约束的面向对象建模过程。

    按照HTTP协议的规定,GET方法是安全且幂等的,POST方法是既不安全也不幂等的(可以用来作为所有写操作的通配方法),PUT、 DELETE方法都是不安全但幂等的。将对资源的操作合理映射到这四个方法上面,既不过度使用某个方法(例如过度使用GET方法或POST方法),也不添 加过多的操作以至于HTTP的四个方法不够用。

    如果发现资源上的操作过多,以至于HTTP的方法不够用,应该考虑设计出更多的资源。设计出更多资源(以及相应的URI)对于RESTful API来说并没有什么害处。

  3. 这个API应该是松耦合的。

    RESTful API的设计包括了三个循序渐进、由低到高的层次:资源抽象、统一接口、超文本驱动。正是这三个层次确保了RESTful API的松耦合性。

    当设计面向互联网的API时,松耦合变成了一种“必须有”的强需求。紧耦合的API非常脆弱,一旦公布出去,服务器端和客户端都无法持续进 化。尤其是服务器端,公布出去的接口根本不敢改,改了之后,几乎所有客户端应用立即无法正常工作。REST这种架构风格就是紧耦合API的解毒剂,这个话 题可以谈的很深,这里就不展开了。感兴趣的读者可以参考《REST实战》。

  4. 这个API中所使用的表述格式应该是常见的通用格式

    在RESTful API中,对于资源的操作,是通过在服务器端-客户端之间传递资源的表述来间接完成的。资源的表述可以有很多种格式,并且在响应和请求中的资源表述格式也 会有所不同。GET/POST响应中的资源表述格式,常见的有HTML、XML、JSON;POST/PUT请求中的资源表述格式,常见的有标准的 HTML表单参数、XML、JSON。

    这些常见表述格式,处理起来非常容易,有大量的框架和库提供支持。所以除非有很合理的要求,通常不需要使用自定义的私有格式。

  5. 使用HTTP响应状态代码来表达各种出错情况

    HTTP响应状态代码,是HTTP协议这个统一接口中用来表达出错情况的标准机制。响应状态代码分成两部分:status code和reason phase。两部分都是可定制的,也可以使用标准的status code,只定制reason phase。

    如果一个所谓的“RESTful API”对于任何请求都返回200 OK响应,在响应的消息体中返回出错情况信息,这种做法显然不符合“确保操作语义的可见性”这个REST架构风格的基本要求。

  6. 这个API应该对于HTTP缓存是友好的

    充分利用好HTTP缓存是RESTful API可伸缩性的根本。HTTP协议是一个分层的架构,从两端的user agent到origin server之间,可以插入很多中间组件。而在整个HTTP通信链条的很多位置,都可以设置缓存。HTTP协议内建有很好的缓存机制,可以分成过期模型和 验证模型两套缓存机制。如果API设计者完全没有考虑过如何利用HTTP缓存,那么这个API的可伸缩性会有很多问题。

时间: 2024-08-05 19:36:21

REST风格的原则的相关文章

推荐代码风格和原则

代码风格 1.有关状态机的设计风格 (1)状态转移单独写成一个模块.(2)状态的操作和判断写成一个模块. 2.如果芯片有乘法器,可以使用*运算符. 3.三态一般只在顶层使用.子模块就将inout分解. 4.敏感信号列表应包括:所有输入信号,判断条件.希望通过增减信号列表实现某项逻辑功能是大错特错的. 5.case是平行结构,没有优先级.if......else if.......else 有优先级.所以优先使用case.减少优先级带来的资源消耗,减少逻辑错误. 6.检查信号的扇出,如果超过信号扇

写代码的风格

有自己的开发风格,在我看来是一个开发成长过程中的里程碑.我也是最近才敢意识自己有一些风格了.在这里简单说说. 首先JavaScript:方法要求单一职责原则.一个方法一定有完整的逻辑开始部分和结束部分,是一个整体.方法尽可能减少无用的变量声明.除了降低副作用还要避免多余的变量占用内存,举个优化别人代码的例子: 考虑用设计模式解决复杂问题.目前成功应用的有策略模式来解决多条件选择问题.职责链模式解决多异步先后执行问题.状态模式解决多状态问题. 考虑用面向对象简化问题. 利用分流函数控制不可控的浏览

《构建之法》阅读笔记(3)

两人合作.团队和流程 代码风格的原则:简洁,易读,无二义性 代码复审的目的不只在于指出代码的错误,还在于发现逻辑错误.算法错误.潜在的错误和回归性错误--当前的修改导致以前修复的缺陷又重新出现.可能需要改进的地方,还可以互相传授经验.让更多的成员熟悉项目各部分的代码.同时熟悉和应用领域相关的实际知识. 二人合作的阶段分为:萌芽阶段.磨合阶段.规范阶段.创造阶段.解体阶段.在二人合作阶段,每个人都有自己的看法与观点,会有很多问题出现,要知道,问题早出现比晚出现要好得多,需要理性思考来获取合适地方法

REST架构概述

REST概述 REST(英文:Representational State Transfer,简称REST)描述了一个架构样式的网络系统,比如 web 应用程序.它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一.在目前主流的三种Web服务交互方案中,REST相比于SOAP(Simple Object Access protocol,简单对象访问协议)以及XML-RPC更加简单明了,无论是对URL的处理还是对Payload的编码,REST都倾

网易云课堂-软件工程(C编码实践篇)

网易云课堂-软件工程(C编程实践篇) 识别代码工程质量: 代码风格: 封装接口: 可重用代码: 可重入函数和线程安全: 代码风格的原则:简明.易读.无二义性:代码风格原则在团队交流过程中非常重要.

《构建之法》第四次

本周我阅读了<构建之法>的第4到8章,其内容着重于两人合作.多人合作的一些注意点以及MSF与软件的需求分析. 与他人进行团队合作的时候,"代码规范"是一件非常重要的事情,代码规范分为风格规范与设计规范,代码风格的原则是:简明.易读.无二义性.在缩进时不要用Tab,而要用4个空格,因为Tab在不同的情况下会显示不同的长度,严重干扰阅读.行宽也是必须限制的,一般在100字符左右.大括号要注意格式的对应.不要把多行语句放在一行上,适当的进行分行.在适当的地方填上注释会让队友方便阅

构建之法 第三次心得

构建之法 第四.五章心得 学习了第四第五章之后,我了解到了两人合作的注意要点,还有团队和开发流程.软件都是在相互合作中完成的,合作的最小单位是两个人.每个人的标准都不一样,对于什么是好的代码规范未必认同,所以我们需要给出一个基准线,即什么是好的代码规范和设计规范. 代码规范可以分成两个部分,一是代表风格规范,主要是文字上的规定,看似是表面文章,实际上非常重要.二是代码设计规范,牵涉到程序设计.模块之间的关系.设计模式等方方面面的通用原则.代码风格的原则是:简明.易读.无二义性.这里可以从几个方面

构建之法:第三次心得

在之前一周学习过个人能力的发展的重要性以及软件工程师个人的成长之后,这一周我主要学习了团队之间的合作的重要性.具体就是学习了构建之法的第四章和第五章. 第四章 第四章,讲的是两人合作.在软件行业的逐步发展中,一个软件基本上一个人是完成不了的,软件都是在相互合作中完成的. 首先,代码除了要足够正确简洁外,还要清晰,让人一目了然.简单来说,代码风格的原则:简明,易读,无二义性.但是,最重要的代码设计规范还是程序设计.模块之间的关系.毕竟,一个软件的流行与否与它的性能与客户需求还是密不可分的.其次,在

构建之法---什么是代码规范?如何与人合作编码?

什么是代码规范?如何与人合作编码? 两个工程师在一起,做得最多的事就是相互看对方的代码,因此我们知道代码最终还是要给人来看,而不是机器,因此要注意代码的规范,即代码风格的规范和代码设计的规范:1.代码风格的原则就是简明易读无二义性,还应注意缩进.行宽.括号,最好是括号单独占一行.2.下划线用来分割变量名字中的作用域标注和变量的语义,所有类型和类都应该采用pascal命名法-单词首字母大写,而变量采用camel命名法-第一个单词全小写,其余单词首字母大写 3.注释是为了解释程序做什么,为什么这样做