`
ufopw
  • 浏览: 160266 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

REST服务的基本设计原则

阅读更多

REST(Representational State Transfer)最早是在2000年由美国加州大学的Roy Fielding在毕业论文 中提出的。如果说Petri网创始人的想法在学术界得到追捧,那么REST这个想法的确在工业界引起了一起狂大的热潮。REST使得人们重新开始思考服务设计的原则和方法。在这片短文里,我将简单讲述一些RESTful风格服务的设计原则。

 

REST定义了一个架构设计原则,其核心思想是服务的设计以系统资源为中心而不是以服务的功能为中心,包括资源的状态如何表示并如何通过HTTP传输给用不同语言编写的客户端。随着REST的设计理念逐渐被越来越多的人接受,实现了REST的框架相继出现,JCP也制定了JSR 311 (JAX-RS: Java API for RESTful Web Services)规范并做为Java 6的一部分进行了发布。

 

当我们在设计Restful服务的时,应该遵循一下设计原则:


原则一: 使用HTTP的方法进行资源访问

 

1) 使用HTTP POST方法去创建 资源

2) 使用HTTP GET方法去读取 资源

3) 使用HTTP PUT 方法去更新 资源

4) 使用HTTP DELETE方法去删除 资源

 

原则二: 使用无状态/无会话的服务设计

 

很长时间以来,人们采用有状态的服务设计从而在客户端与服务端的多次交互中维护一定的上下文。表格分页应用就是最常见的一个例子,通常程序员在HTTP Session中保持当前页的变量currentPage,当用户用地址http://www.foo.com/articles?action=nextPage来获取下一页的时候,服务可以根据currentPage获取下一页的数据,即返回第currentPage+1页的数据。

 

然而,有状态的设计使得程序很难随着工作负载的增加而进行伸缩。比如某个服务实例拥有10000个会话的状态,则通常很难通过增加服务实例来分担其工作负载:工作负载被锁定了! 反之,如果程序被设计成一个无状态的,则可以自由增加服务实例,并且在这些实例之间平衡负载,从而使得服务具有较好的伸缩性,这在大规模分布式系统中尤其重要!!


原则三: 用目录结构风格的URL设计来表示资源

 

用清晰的URL路径表示资源可以使客户端更容易理解和操作资源。URL可以被看作是一种自我解释的接口,不需要太多解释就可以让人明白该URL指向的是什么资源以及如何获得相关的资源。

 

下面是几个例子,供大家参考:

http://www.foo.com/research/articles/{article_title}

http://www.foo.com/research/articles/{year}/{month}/{day}/{article_title}

 

原则四: 使用XML或JSON来传输数据

 

服务和请求的消息数据中包含了对于资源的属性的描述,服务应该采取结构良好并且易于阅读的方式来描述资源。资源可能是数据库中的某个记录集合或者是一个具体的记录,可以是文档,甚至可以是数据中心的服务器。XML、JSON都是结构良好的语言,并且适于阅读。我个人比较偏好使用JSON,更加简洁。下面是两个XML和JSON消息的例子,供大家参考。

 

JSON Example:

{
    "menu": {
          "id": "file",
         "value": "File",
          "popup": {
               "menuitem": [
                         {"value": "New", "onclick": "CreateNewDoc()"},
                        {"value": "Open", "onclick": "OpenDoc()"},
                        {"value": "Close", "onclick": "CloseDoc()"}
                ]
            }
    }
}

相应的XML:

<menu id="file" value="File">
  <popup>
       <menuitem value="New" onclick="CreateNewDoc()" />
       <menuitem value="Open" onclick="OpenDoc()" />
       <menuitem value="Close" onclick="CloseDoc()" />
 </popup>
</menu>

 

最后,用一小段总结一下REST和XML-RPC的区别,从而加深大家对REST的理解。大家经常会碰到很多用XML表示数据并用HTTP进行传输消息的应用,那么是不是这些应用都是RESTful风格的呢?其实未必。本质区别就在于URL所表示的是资源还是功能,如果是资源则是RESTful风格的,如果是功能则是XML-RPC.

分享到:
评论
1 楼 duyangsss 2012-02-09  
总结得很好,很有用。

相关推荐

    使用Go构建REST风格的Web服务的软件包-Golang开发

    用于使用Google Go Code...这项基本的REST设计原则在创建,读取,更新和删除(CRUD)操作与HTTP方法之间建立了一对一的映射。 根据此映射:GET =检索资源的表示形式POST =如果要将内容发送到服务器以创建下属,则创建

    RestFul服务介绍

    1. REST介绍 REpresentational State Transfer (REST) 是一种架构原则,其中将 ...REST 的基本设计原则对典型 CRUD 操作使用 HTTP 协议方法: POST - 创建资源 GET - 检索资源 PUT – 更新资源 DELETE - 删除资源

    go-restful:使用Go构建REST风格的Web服务的软件包

    这项基本的REST设计原则在创建,读取,更新和删除(CRUD)操作与HTTP方法之间建立了一对一的映射。 根据此映射: GET =检索资源的表示形式 POST =如果要使用服务器端算法将内容发送到服务器以创建指定资源集合的...

    RESTful传感器API_Python_代码_相关文件_下载

    介绍 ...我们将从描述您应该期望的基本 JSON 有效负载开始,但也请务必查看 API 概念概述,以获取有关驱动 API 的常见主题和设计原则的更多信息。 更多详情、使用方法,请下载后细读README.md文件

    ASP EXCEL导入SQL

    这个原则是源自于我们对于数据库表的数据操作:(生)、select(见)、(变)和(灭),所以有时候CRUD也写作为RUDI,其中的I就是,这四个操作是一种原子操作,即一种无法再分的操作,通过它们可以构造复杂的操作过程,正如...

    java猜字母游戏源码-api-design:LivingSocialAPI设计指南

    java猜字母游戏源码LivingSocial API 设计指南 版本 ...设计的基本要素是什么? 为什么要有 API 设计指南? API 设计指南为我们提供了以下内容: 具有一致外观的 API。 以可预测/预期方式运行的 API

    存储服务OpenStackCinder.zip

    Cinder卷管理的基本原则是在共享存储上创建一个lun, 然后把这个lun作为一个block device给attach到一个虚拟机上。但是对于当前主流的存储,能够支持的最大lun数量非常有限,比如我们经常使用的Huawei S3900, 最多能...

    ITU-ACM-19-20-Contract-First-Api-Development-Study-Group:该存储库包含有关我们在讲座中涵盖的主题的源文件-python source file

    获得有关“合同优先” API设计原则的专业知识 教学大纲 #日期 #话题 #描述 第一周 HTTP,REST和Flask的基础 设置开发环境和工具。 HTTP,RESTful API和Flask的快速概述。 合同优先API设计简介 第二周 API合约,...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    23.1 菜单设计原则和样式 437 23.2 菜单和菜单事件 438 23.2.1 创建菜单 438 23.2.2 处理菜单事件 443 23.3 快捷菜单 449 23.4 windows通用对话框 453 23.5 增强wpf应用程序的响应能力 456 第23章快速参考 ...

    DevOpsAndMore:您好,欢迎您;-)该资料库包含许多有用的资料,并且每两周填充一次

    基本理论,原则和最佳实践敏捷方法SQL / NoSQL数据库Miscroservices与独石设计模式和最佳实践服务网工作面试。 问/答。 方法论部署软件和方法故障排除(方法,微服务架构中的日志解析,性能分析等

    谷歌开源的容器集群管理系统Kubernetes.zip

    3) Rolling updatesReplication Controller的设计原则使得可以一个一个地替换pods来rolling updates服务。4) Multiple release tracks如果需要在系统中运行multiple release的服务,Replication Controller使用...

    PHP和MySQL WEB开发(第4版)

    17.5 在Apache的.htaccess文件中使用基本身份验证 17.6 使用mod_auth_mysql身份验证 17.6.1 安装mod_auth_mysql 17.6.2 使用mod_auth_mysql 17.7 创建自定义身份验证 17.8 进一步学习 17.9 下一章 第18章 使用PHP和...

    PHP和MySQL Web开发第4版pdf以及源码

    17.5 在Apache的.htaccess文件中使用基本身份验证 17.6 使用mod_auth_mysql身份验证 17.6.1 安装mod_auth_mysql 17.6.2 使用mod_auth_mysql 17.7 创建自定义身份验证 17.8 进一步学习 17.9 下一章 第18章 ...

    PHP和MySQL Web开发第4版

    17.5 在Apache的.htaccess文件中使用基本身份验证 17.6 使用mod_auth_mysql身份验证 17.6.1 安装mod_auth_mysql 17.6.2 使用mod_auth_mysql 17.7 创建自定义身份验证 17.8 进一步学习 17.9 下一章 第18章 ...

    full-stack-assessment-test

    KIWI.KI编码挑战语境针对此挑战,您将使用由用户,门,地址和权限组成的简单数据模型。 数据库中的每个门都位于某个地址。... 您可以自由决定端点的设计,但要确保它们符合REST原则。一般注意事项保持简洁并切合实际

    java-refactoring-test:Java重构测试

    您运用成熟的设计原则的能力 您编写有用且有效的测试的能力 随时修改您想要的任何内容! :) 先决条件 您必须有一个Github帐户。 如果您没有,请通过创建一个。 此仓库使用Git进行源代码管理(SCM)。 如果您尚未在...

    JAVA上百实例源码以及开源项目

    2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性...

    JAVA上百实例源码以及开源项目源代码

    2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性...

    Google_MapReduce中文版-系统架构

    ·优秀的系统分析师必读——需求分析20条原则 相关主题 最新文章 ·Google MapReduce中文版 ·Google的系统工程师(SA)如何工作 ·The Google File System中文版 ·无挑战,不工作之 -系统分析师招聘答案 ·五年Skype...

Global site tag (gtag.js) - Google Analytics