怎样更好的设计你的REST API之基于REST架构的Web Service设计及REST框架实现
一、REST
含状态传输(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。
眼下在三种主流的Web服务实现方案中。由于REST模式与复杂的SOAP和XML-RPC相比更加简洁。越来越多的web服务開始採用REST风格设计和实现。
比如:Amazon.com提供接近REST风格的Web服务进行图书查找;雅虎提供的Web服务也是REST风格的。
二、REST的架构设计
REST(Representational State Transfer)是一种轻量级的Web Service架构风格,事实上现和操作明显比SOAP和XML-RPC更为简洁,能够全然通过HTTP协议实现,还能够利用缓存Cache来提高响应速度。性能、效率和易用性上都优于SOAP协议。
REST架构遵循了CRUD原则,CRUD原则对于资源仅仅须要四种行为:Create(创建)、Read(读取)、Update(更新)和Delete(删除)就能够完毕对其操作和处理。这四个操作是一种原子操作。即一种无法再分的操作。通过它们能够构造复杂的操作过程,正如数学上四则运算是数字的最主要的运算一样。
REST架构让人们真正理解我们的网络协议HTTP本来面貌,对资源的操作包含获取、创建、改动和删除资源的操作正好相应HTTP协议提供的GET、POST、PUT和DELETE方法,因此REST把HTTP对一个URL资源的操作限制在GET、POST、PUT和DELETE这四个之内。
这样的针对网络应用的设计和开发方式。能够减少开发的复杂性。提高系统的可伸缩性。
三、REST的设计准则
REST架构是针对Web应用而设计的,其目的是为了减少开发的复杂性,提高系统的可伸缩性。REST提出了例如以下设计准则:
l 网络上的全部事物都被抽象为资源(resource)
l 每一个资源相应一个唯一的资源标识符(resource identifier)
l 通过通用的连接器接口(generic connector interface)对资源进行操作
l 对资源的各种操作不会改变资源标识符
l 全部的操作都是无状态的(stateless)
四、要点及标准
须要注意的是。REST是设计风格而不是标准。
REST通常基于使用HTTP。URI,和XML以及HTML这些现有的广泛流行的协议和标准。
l 资源是由URI来指定。
l 对资源的操作包含获取、创建、改动和删除资源,这些操作正好相应HTTP协议提供的GET、POST、PUT和DELETE方法。
l 通过操作资源的表现形式来操作资源。
l 资源的表现形式则是XML或者HTML。取决于读者是机器还是人。是消费web服务的客户软件还是web浏览器。
当然也能够是不论什么其它的格式。
五、REST的要求
l client和server结构
l 连接协议具有无状态性
l 可以利用Cache机制增进性能
l 层次化的系统
l 随需代码 - Javascript (可选)
六、关于状态
应该注意差别应用的状态和连接协议的状态。HTTP连接是无状态的(也就是不记录每一个连接的信息),而REST传输会包括应用的全部状态信息,因此能够大幅减少对HTTP连接的反复请求资源消耗。
七、含状态传输的 Web 服务
含状态传输的 Web 服务(也称为 RESTful Web API)是一个使用HTTP并遵循REST原则的Web服务。
它从下面三个方面资源进行定义:
l 直观简短的资源地址:URI,比方:http://example.com/resources/。
l 传输的资源:Web服务接受与返回的互联网媒体类型,比方:JSON。XML ,YAML 等。
l 对资源的操作:Web服务在该资源上所支持的一系列请求方法(比方:POST,GET,PUT或DELETE)。
下表列出了在实现 含状态传输的 Web 服务时HTTP请求方法的典型用途。
HTTP 请求方法在RESTful Web 服务中的典型应用 |
||||
资源 |
GET |
PUT |
POST |
DELETE |
一组资源的URI。比方http://example.com/resources/ |
列出 URI,以及该资源组中每一个资源的具体信息(后者可选)。 |
使用给定的一组资源替换当前整组资源。 |
在本组资源中创建/追加一个新的资源。 该操作往往返回新资源的URL。 |
删除 整组资源。 |
单个资源的URI,比方http://example.com/resources/142 |
获取 指定的资源的具体信息。格式能够自选一个合适的网络媒体类型(比方:XML、JSON等) |
替换/创建 指定的资源。 并将其追加到对应的资源组中。 |
把指定的资源当做一个资源组,并在其下创建/追加一个新的元素,使其隶属于当前资源。 |
删除 指定的元素。 |
PUT 和 DELETE 方法是幂等方法。GET方法是安全方法 (不会对server端有改动,因此當然也是幂等的)。
不像基于SOAP的Web服务。RESTful Web服务并没有的“正式”标准[2]。 这是由于REST是一种架构。而SOAP仅仅是一个协议。
尽管REST不是一个标准,但在实现RESTful Web服务时能够使用其它各种标准(比方HTTP,URL。XML。PNG等)。
八、实现举例
比如。一个简单的网络商店应用,
列举全部商品,
GET http://www.store.com/products
呈現某一件商品,
GET http://www.store.com/product/12345
下单购买,
POST http://www.store.com/order
<purchase-order>
<item> ... </item>
</purchase-order>
九、REST的长处
l 可更高效利用缓存来提高响应速度
l 通讯本身的无状态性能够让不同的server的处理一系列请求中的不同请求,提高server的扩展性
l 浏览器就可以作为client,简化软件需求
l 相对于其它叠加在HTTP协议之上的机制,REST的软件依赖性更小
l 不须要额外的资源发现机制
l 在软件技术演进中的长期的兼容性更好
十、个人总结
l REST架构仅仅是一种思想,并没有限定不论什么技术,不论什么语言。
l REST的本质就是HTTP调用,用于减少各个应用之间的耦合度。
l 良好的REST 架构。应该有统一的表示方式和数据格式,可以有效的把各种资源组织起来,并可以进行有效的控制。
怎样更好的设计你的REST API之基于REST架构的Web Service设计及REST框架实现的更多相关文章
- 基于REST架构的Web Service设计
来自: http://www.williamlong.info/archives/1728.html 先前我曾经介绍过利用Apache Axis实现基于SOAP的Web Service实现技术和相关代 ...
- (转)基于REST架构的Web Service设计
原文出处:http://www.williamlong.info/archives/1728.html ------------------------------------------------ ...
- 如何设计一个优秀的API(转载)
最近在整理框架的一些 API,觉得很有必要总结一下 API 兼容性的设计.下图是我自己当下的一些总结,慢慢维护: 网上搜索了一下,一个多月前,“标点符”已经发布了下面这篇文章,觉得写得非常不错,转载于 ...
- 如何设计一个优秀的API(转)
到目前为止,已经负责API接近两年了,这两年中发现现有的API存在的问题越来越多,但很多API一旦发布后就不再能修改了,即时升级和维护是必须的.一旦API发生变化,就可能对相关的调用者带来巨大的代价, ...
- 基于MVC4+EasyUI的Web开发框架形成之旅--MVC控制器的设计
自从上篇<基于MVC4+EasyUI的Web开发框架形成之旅--总体介绍>总体性的概括,得到很多同行的关注和支持,不过上一篇主要是介绍一个总体的界面效果和思路,本系列的文章将逐步介绍其中的 ...
- 如何设计一个优秀的API
如何设计一个优秀的API - 文章 - 伯乐在线 http://blog.jobbole.com/42317/ 如何设计一个优秀的API - 标点符 https://www.biaodianfu.co ...
- JDBC中DAO+service设计思想
一.DAO设计思想 a) Data access Object(数据访问对象):前人总结出的一种固定模式的设计思想. 高可读性. 高复用性. 高扩展性. b) JDBC代码实现的增删改查操作是有复用需 ...
- 实战使用Axure设计App,使用WebStorm开发(3) – 构建页面架构
系列文章 实战使用Axure设计App,使用WebStorm开发(1) – 用Axure描述需求 实战使用Axure设计App,使用WebStorm开发(2) – 创建 Ionic 项目 实战使 ...
- 基于“事件”驱动的领域驱动设计(DDD)框架分析
摘抄自 从去年10月份开始,学了几个月的领域驱动设计(Domain Driven Design,简称DDD).主要是学习领域驱动设计之父Eric Evans的名著:<Domain-driven ...
随机推荐
- treeTable的使用(ajax异步获取数据,动态渲染treeTable)
一.展示效果(treetable基本样式https://www.cnblogs.com/shuihanxiao/p/10413454.html) 二.html文件(若一个页面又多个treetable, ...
- mysql时间的处理
mysql中格式化时间为: 1,DATE_FORMAT(APPLYDATE,'%Y-%m-%d %H:%i:%S') AS APPLYDATE 2,DATE_FORMAT(CHKSIGNDATE, ' ...
- Sqlserver查询结果集插入新表
数据库“Test” 数据库“Test2” 表 “fromTable” 表 “toTable” 表 “newTable” 字段 “name”,“age”,“gender” 原因:公司有2个数据库,一个是 ...
- post processing in CFD
post post Table of Contents 1. Post-processing 1.1. Reverse flow 1.1.1. reasons 1.1.2. solutions 1.2 ...
- Spring Boot集成百度Ueditor
遇到的问题: 1.将ueditor加入/static目录下,能正常显示,但是出现“请求后台配置项http错误,上传功能将不能正常使用!”(解决在下面,都是自定义上传的,如果需要官方的示例,我也无能为力 ...
- solr 分析器
源https://www.w3cschool.cn/solr_doc Solr 分析器被指定为 schema.xml 配置文件中的<fieldType>元素的子元素(在与 solrconf ...
- Run-time Settings--General--Run Logic
LR单用户,重复操作日志 案例:假如你想在一个脚本中,实现登录执行1次,查询执行2次,插入执行3次,怎么办?录3个脚本?每个事务分别在脚本中复制N次? 当然不用,LR早就想到了你的需求,下面让我们隆重 ...
- Leetcode 315.计算右侧小于当前元素的个数
计算右侧小于当前元素的个数 给定一个整数数组 nums,按要求返回一个新数组 counts.数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元 ...
- Leetcode 229.求众数II
求众数II 给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素. 说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1). 示例 1: 输入: [3,2,3] 输出: ...
- [Poi2011]Meteors 题解
题目大意: 给定一个环,每个节点有一个所属国家,k次事件,每次对[l,r]区间上的每个点点权加上一个值,求每个国家最早多少次操作之后所有点的点权和能达到一个值. 思路: 整体二分(二分答案),对于每个 ...