理解RESTful架构

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

原文:http://www.ruanyifeng.com/blog/2011/09/restful.html?20160826000527

越来越多的人开始意识到,网站即软件,而且是一种新型的软件。

这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点。

网站开发,完全可以采用软件开发的模式。但是传统上,软件和网络是两个不同的领域,很少有交集;软件开发主要针对单机环境,网络则主要研究系统之间的通信。互联网的兴起,使得这两个领域开始融合,现在我们必须考虑,如何开发在互联网环境中使用的软件。

二、名称

Fielding将他对互联网软件的架构原则,定名为REST,即Representational State Transfer的缩写。我对这个词组的翻译是"表现层状态转化"。

如果一个架构符合REST原则,就称它为RESTful架构。

要理解RESTful架构,最好的方法就是去理解Representational State Transfer这个词组到底是什么意思,它的每一个词代表了什么涵义。如果你把这个名称搞懂了,也就不难体会REST是一种什么样的设计。

三、资源(Resources)

REST的名称"表现层状态转化"中,省略了主语。"表现层"其实指的是"资源"(Resources)的"表现层"。

所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。

所谓"上网",就是与互联网上一系列的"资源"互动,调用它的URI。

四、表现层(Representation)

"资源"是一种信息实体,它可以有多种外在表现形式。我们把"资源"具体呈现出来的形式,叫做它的"表现层"(Representation)。

比如,文本可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现,甚至可以采用二进制格式;图片可以用JPG格式表现,也可以用PNG格式表现。

URI只代表资源的实体,不代表它的形式。严格地说,有些网址最后的".html"后缀名是不必要的,因为这个后缀名表示格式,属于"表现层"范畴,而URI应该只代表"资源"的位置。它的具体表现形式,应该在HTTP请求的头信息中用Accept和Content-Type字段指定,这两个字段才是对"表现层"的描述。

五、状态转化(State Transfer)

访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及到数据和状态的变化。

互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。

客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。

六、综述

综合上面的解释,我们总结一下什么是RESTful架构:

  (1)每一个URI代表一种资源;

  (2)客户端和服务器之间,传递这种资源的某种表现层;

  (3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。

七、误区

RESTful架构有一些典型的设计误区。

最常见的一种设计错误,就是URI包含动词。因为"资源"表示一种实体,所以应该是名词,URI不应该有动词,动词应该放在HTTP协议中。

举例来说,某个URI是/posts/show/1,其中show是动词,这个URI就设计错了,正确的写法应该是/posts/1,然后用GET方法表示show。

如果某些动作是HTTP动词表示不了的,你就应该把动作做成一种资源。比如网上汇款,从账户1向账户2汇款500元,错误的URI是:

  POST /accounts/1/transfer/500/to/2

正确的写法是把动词transfer改成名词transaction,资源不能是动词,但是可以是一种服务:

  POST /transaction HTTP/1.1
  Host: 127.0.0.1
  
  from=1&to=2&amount=500.00

另一个设计误区,就是在URI中加入版本号

  http://www.example.com/app/1.0/foo

  http://www.example.com/app/1.1/foo

  http://www.example.com/app/2.0/foo

因为不同的版本,可以理解成同一种资源的不同表现形式,所以应该采用同一个URI。版本号可以在HTTP请求头信息的Accept字段中进行区分(参见Versioning REST Services):

  Accept: vnd.example-com.foo+json; version=1.0

  Accept: vnd.example-com.foo+json; version=1.1

  Accept: vnd.example-com.foo+json; version=2.0

(完)

 

转载于:https://my.oschina.net/liujiest/blog/738068

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

凡是过往,皆为序章。

凡是过往,皆为序章今天是元旦假期的最后一天,这三天我一直在想,21年的年终总结应该如何下笔。其实心里面想表达和记录的事情很多,可当真正坐在电脑前时,却发现没有头绪。贵有恒,何必三更起五更眠。最无益&a…

查看操作系统版本linux_LINUX操作系统常用操作收录(二):查看文件内容命令小结...

先整体了解一下如何查看文件内容的命令vi 兼有修改功能的查看方式,会单独打开整个文件vim 可修改文件内容并且显示当前查看位置在文件中的%多少cat 由第一行开始显示内容,并将所有内容输出tac 从最后一行倒序显示内容,并将所有内容输出more…

crond定时任务详细分析

一、定时任务crond的介绍 crond是linux系统中用来定期执行命令或指定程序任务的一种服务或软件。一般情况下,我们安装文成系统之后,默认变回启动crond任务调度服务,crond服务会定期(默认每分钟检查一次)检查系统中是否有要执行的任务工作。…

OCS2007R2升级LyncSrv2013 PART4:关联边缘

完成拓扑的合并后,由于边缘服务器尚未做迁移和升级,所以此时我们的Lync Server没有边缘服务、联盟路由等。我们就可以把OCS的边缘服务器与Lync Server前端进行关联,暂时使用OCS的联盟路由和边缘服务。要关联OCS边缘服务器,需要打开…

2021技术文大盘点 | 打包过去,​面向未来

先用四句诗词快速描述 一下我的写作心得1. 只在此山中,云深不知处作为开发人员,常执着于机器0,1代码,非假既真;真实世界是很主观的,需要精致细节,更多时候需要全局把控。带着问题写作,对事物理解…

Ansible 一步一步从入门到精通(一)

一:安装ansiblemac:1. 安装 Homebrew (get the installation command from the Homebrew website).2. 安装Python 2.7.x ( brew install python ).3. 安装 Ansible ( sudo pip install ansible ).linux:如果系统中安装了python-pip和python-d…

客户细分总结

随着营销方式的多变、客户需求各异、营销增长受阻等多方面影响,企业的营销面临前所未有的挑战和机遇,精准化营销似乎已成为很多公司的选择,本文针对以下客户细分五大模块进行总结: 一:客户细分的必要性: 顾…

Linux操作系统备份之二:通过tar拷贝分区实现Linux操作数据的在线备份

http://www.tektea.com/archives/2163.html。 在《Linux操作系统备份之一:使用LVM快照实现Linux操作系统数据的在线备份》文章中,我们介绍了使用LVM快照实现操作性系统在线备份的方法,LVM快照可以实现在线操作系统数据的备份,在线…

cad快捷命令大全_最全CAD快捷键命令大全(图文版、文字版、键盘版)

在 CAD操作中我们常用一些快捷键来代替鼠标操作从而提高绘图效率,以下是小编为大家整理的常用快捷键大全,涵盖图文版、文字版、键盘版。图文版:文字版:一、常用功能键F1: 获取帮助F2:实现作图窗和文本窗口的切换F3:控制是否实现对…

WEB API:语音识别

2019独角兽企业重金招聘Python工程师标准>>> x-webkit-speech 语音输入功能: http://www.iinterest.net/2012/01/07/x-webkit-speech/ HTML5语音输入(淘宝语音搜索)x-webkit-speech方法 支持webkit内核: http://www.wu…

cad在线转换_CAD转PDF批量转换怎么转?教你一次性操作,一看就会

接触AutoCAD设计,自然离不开各种的格式转换,CAD转PDF,CAD转JPG、CAD版本转换……感觉不知道哪里下手。特别是批量进行转换操作,更是没有头绪,其实很简单,这里教你一招轻松转换,看一遍变就会操作…

怎么写一个高性能应用?

首先声明,这不是写一个高性能应用的唯一选择,只是自己实践后的一些心得分享。开发前定个小目标有目标的好处是不会降配开发,也不会过度开发目标指标:并发数,TPS,响应时间等1、模块独立性让路高性能&#xf…

[Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例二.

为了更好的排版, 所以将IK分词器的安装重启了一篇博文, 大家可以接上solr的安装一同查看.[Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例一: http://www.cnblogs.com/wang-meng/p/5814798.html8, 打开浏览器查看solr可视化界面到了这里solr就配置好了, 可是我们的IK …

百度pcs 如何获取Access Token

为什么80%的码农都做不了架构师?>>> 看官方两篇文章: 《获取Access Token》 http://developer.baidu.com/wiki/index.php?titledocs/pcs/guide/token_authorize 《使用Refresh Token获取Access Token》 http://developer.baidu.com/wik…

怎么把ppt文字大小设置一致_PPT“烫金字”,不用再劳烦设计师了

平时,我们经常看到“烫金字”,好像要设计师用Photoshop才能做的样子。想到Photoshop,很多人便止步了。今天,菜鸟菌教大家使用PPT轻松制作烫金字,不用再麻烦设计师了,自己也可以简单做出这样的烫金字。只要3…

无状态服务(stateless service)

一、定义 无状态服务(stateless service)对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以从外部获取到(比如说数据库&#…

吃屎是一种什么样的体验?

全世界只有3.14 % 的人关注了爆炸吧知识没有什么能够阻挡人类对美食的向往这两天,有代表建议“加强小龙虾等入侵物种生态防控”的话题上了热搜榜,不曾想底下的评论竟然都在讨论“吃”。把入侵物种吃到濒危这个梗说多了,有时候还真担心刚懂事的…