在项目上使用到了Rest技术,应该是Rest的服务概念才对。主要是对外(BPM)暴露API来提供Service。推荐一篇有质量的文章,接下来会系统一点的学习一下Restful概念。http://kb.cnblogs.com/page/91827/

 

REST介绍

  如果要说什么是REST的话,那最好先从Web(万维网)说起。

  什么是Web呢?读者可以查看维基百科的词条(http://zh.wikipedia.org/zh-cn/Web),具体的我就不多说了。总之,Web是我们在互联网上最常用的服务,甚至在某些人的心中,互联网就是Web。当然,Web只是互联网的一部分而已,只是大家用的最多而已,我们访问的所有网站都是基于Web。

  那么,Web和REST之间究竟有什么关系呢?我们接下来将聊聊组成Web的几大基础技术,URI(统一资源标识符,用来标识资源)、HTTP(超文本传输/转移协议,用来操作资源)、Hypertext(超文本,用来描述资源的内容与状态,我们可以用HTML、XML、JSON或者自定义格式的文本来描述任何一个资源)。

  那我们再来看看什么是REST呢?其实REST并不是一种新兴的技术语言,也不是什么新的技术框架。准确来说说REST只是一种概念、风格或者约束,是回归HTTP本身的建议。

  REST是由Roy Thomas Fieding在他的博士论文《Architectural Styles and the Design of Network-based Software Architectures》(《架构风格与基于网络的软件架构设计》)中提出的一种架构思想。Roy Fielding是Apache基金会的合作创作者,同时也是HTTP、URI等Web基础协议的主要设计者。从Roy Fielding的背景,我想大家就应该能了解到REST与Web之间的关系了吧。的确,在REST中我们关注技术实际上也只是URI、HTTP、Hypertext而已。

  Roy在他的论文中提出了一个RESTful应用应该具备的几点约束。

  • 每个资源都应该有一个唯一的标识
  • 使用标准的方法来更改资源的状态
  • Request和Response的自描述
  • 资源多重表述
  • 无状态的服务

  Roy认为,只有具备了上面的约束的应用才能算是REST应用,其实现在好多所谓的REST应用或服务,其实并不能算是真正的REST应用。

  我发现,其实目前很多所谓的REST应用,只是RPC而已,出现这样的情况其实很正常,因为RPC实际上更符合一般程序员的思维。其实REST和RPC之间还是有很大的差异的,下面我们说一说REST和RPC之间的区别。

  • REST强调资源有唯一的URI;而RPC更加强调过程(动词),由统一的接口来调用它们。
  • REST回归HTTP最初的设计;RPC仅仅只是把HTTP作为传输协议来使用。
  • REST是由超文本驱动的;RPC是由方法驱动的。
  • REST强调HTTP通信的语义可见性,通过消息头和标准的HTTP方法来体现;RPC把语义封装在HTTP消息体中。
 

  REST的应用场景

  通过上面的介绍,大家应该对REST有一些最基本的了解,由于RESTf应用的这些约束,我们可以很轻易的了解和使用REST的服务(只要你了解HTTP)。

  其实,我们经常容易犯一个错误就是,当我们了解了一个新的技术,就会用这个技术来解决所有的问题。有一句谚语是这么来说的:“在锤子的眼里,所有的东西都是钉子”,其实REST也只是我们工具箱里面的其中的一个工具而已,希望不要把它当做我们唯一的工具。那么我们就来聊聊适合使用REST的应用场景和不适合使用REST的应用场景。

  在我看来REST最适合的应用场景其实是需要对外暴露服务的时候,这个时候,我们可以充分利用REST的自描述、无状态、唯一标识等特性来提供清晰、友好的API,而且现在的Jesery、RESTEasy等JAX-RS框架也提供了OAuth的支持,基本上能够保证服务安全。

  最不适合的应用场景是对性能要求高的系统内部之间的服务调用,当你在这个时候使用REST的话,那么REST所有的特性都会变成拖累。这个时候,还是需要选择更底层的通信协议和方式会更好一些,比如ICE。这样的错误,我曾经犯过,后来通过很长时间的努力才慢慢的将这个错误改过来。

  规划REST服务

  当我们要规划一个REST服务的时候,其中最关键的概念其实就是“资源”。

  资源是什么呢?广义上讲,任何事物只要它有用,那么它就是资源。狭义的讲(在Web环境中),它是一个可以存放、连接在计算机上,可以通过比特流进行操控的实体。一个实体想成为资源,它必须有一个URI。在这里URI包含了两重含义:1)它是资源的名称 2)它是资源的地址。

  在我们规划URI的时候,有几点希望大家能够注意一下:

  • 一个URI标识一个资源,但是一个资源可以被多个URI标识。
  • 资源也是有层次的,这个层次应该在URI上充分的体现出来。
  • 在规划URI的时候,需要定义一些团队内部确认的关键字或符号,这些关键字或符号是有特殊意义的,不能随便使用。
  • 需要有一个URI定义的文档,以备以后的查询和维护。
  • 可以使用URI Template来描述URI的定义。如何使用URI Template也看看这篇文章

  当我们定义好资源之后,接下来要做的事情就是定义操作资源的方法以及资源的表述格式了。

  使用HTTP提供的基本方法来对资源进行操作,一般的操作定义如下:POST(创建资源)、GET(获取资源)、PUT(修改资源)、DELETE(删除)。它们正好对应了CRUD。

  对资源的表述,一般的选择会是XML,但是我更加推荐使用JSON来表述资源。在网络中的传输量也小,而且也便于JavaScript来解析,而且现在其他语言解析也是非常方便的事情。不过,最关键的还是占用更少的资源,让同样的资源能够服务更多的人。

  下面的这张图就很好的说明了REST中最重要的围绕资源的三角关系。

  在InfoQ上有一篇很好的文章来介绍如何规划REST服务《如何获取(GET)一杯咖啡——星巴克REST案例分析》,估计大家看完这篇文章,应该对如何规划REST服务会有更深的认识。

  选择一个快速方便的REST框架

  现在REST的框架也非常多,推荐大家使用Jersey和RESTEasy来创建自己的REST服务。

  这两个框架都出自名门,Jersey是由SUN提供的JAX-RS实现参考,对JAX-RS支持的最为充分和快速,基本上所有的JAX-RS的新特性都会在Jersey里第一个体现出来,而且提供了相当全的例子让你学习。RESTEasy则是由JBoss开源的项目,它同样有很多优点,而且文档也比Jersey更好一些,但是和他JBoss应用服务器绑定的比较紧密,这点我个人不太喜欢,如果是熟悉JBoss应用服务器的人可以选择RESTEasy,它给人的感觉更加成熟一些,不像Jersey会很快的加入新的特性。不过,需要根据个人自己的喜好来选择。

  如何使用Jersey来快速创建REST应用,参见通过Jersey快速构建REST应用,如何使用RESTEasy快速创建REST应用,参见使用RESTEasy快速创建REST应用

  发布REST服务需要注意的地方

  之前我也提到了使用REST的最佳的场景是对外提供公开的服务,也就是所谓的OpenAPI。一旦开放了API,我们就很难控制这些API的使用及其调整了,如果在开放这些API之前考虑的不周到的话,那么后期的维护那就会是一个非常麻烦的事情了。所以,当我们决定要开放API的时候,那么我们一定要注意一些事情,下面的这些算是我的经验总结。

  对外暴露API时,需要注意版本规划,以便以后API的升级和维护。API的版本规划,在开始开放API的之前,是一件很容易被忽视的。但是一旦你的API开放之后,那么你就会发现,没有对开放的API进行版本规划,是一件非常愚蠢的事情。当你的API使用的人越来越多,当你的开放的API越来越多,一旦某个API要升级,输入和输出发生变化的时候,你根本不知道该通知谁来升级,解决问题的时候也非常麻烦。

  同样,由于对外暴露API之后,你很难控制API被调用的次数和意图,需要在一些关键的API被调用的次数和频率上进行控制,以免受到恶意的攻击。但是,到底次数和频率应该控制在一个什么样的程度,就要看你的API的关键程度以及负载能力了,每个系统都会有自己的评判,只要你掌握好了这个尺度,应该都不会有问题的。

  另外,由于现在浏览器的限制,只能使用HTTP的GET和POST方法,如果通过AJAX直接调用REST服务,当你的服务中需要使用HTTP的PUT或者DELETE方法来调用的话,最好是考虑使用重载POST方式将需要使用PUT和DELETE方法调用的服务能够通过POST来调用。

REST Web 服务介绍的更多相关文章

  1. SOAP Web 服务介绍

    已经跨入 2015 年,当今最为常见的两种 Web 服务类型分别是: REST 和 SOAP .不过,从趋势来看,越来越多人已经开始使用 REST 风格的 Web 服务.而 SOAP 大多也开始或已经 ...

  2. Vue-cli 搭建web服务介绍

    Node.js 之 npm 包管理 - Node.js 官网地址:点我前往官网 - Node.js 中文镜像官网: 点我前往```` Node.js 是一个基于 Chrome V8 引擎的 JavaS ...

  3. Web服务基础介绍

    Web服务基础介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.正常情况下的单次web服务访问流程 博主推荐阅读: https://www.cnblogs.com/yinzh ...

  4. web服务的简单介绍及apache服务的安装

    一,web服务的作用:  是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档.可以放置网站文件,让全世界浏览:   可以放置数据让全世界下载.目前最主流的三个Web服务器是Ap ...

  5. Web网络服务介绍

    Web网络服务也叫WWW(World Wide Web),一般是指能够让用户通过浏览器访问到互联网中文档资源服务.目前提供WEB网络服务的程序有Apache .Nginx 和  IIS  等等,Web ...

  6. REST Web 服务(二)----JAX-RS 介绍

    1. 什么是JAX-RS? JAX-RS——Java API for RESTful Web Services,是为 Java 程序员提供的一套固定的接口(Java API),用于开发表述性状态转移( ...

  7. REST Web 服务(一)----REST 介绍

    1. 什么是REST? REST 定义了一组体系架构原则,您可以根据这些原则设计以系统资源为中心的 Web 服务,包括使用不同语言编写的客户端如何通过 HTTP 处理和传输资源状态. 2. REST的 ...

  8. Yii2高速构建RESTful Web服务功能简单介绍

    Yii2相比Yii1而言,一个重大的改进是内置了功能完备的RESTful支持. 其内置RESTful支持提供了例如以下功能: 使用ActiveRecord的通用接口来高速构建原型: 应答格式协商(缺省 ...

  9. Web测试介绍2一 安全测试

            安全测试是在IT软件产品的生命周期中,特别是产品开发基本完成到发布阶段,对产品进行检验以验证产品符合安全需求定义和产品质量标准的过程. 主要安全需求包括: (i) 认证 Authent ...

随机推荐

  1. QQ登录网站接入

    QQ网站登录是一个非常常用的功能,网上有很多的资料,在此只做一个整理: QQ登录接入也在不断的升级,目前我发布的是2.1,很多资料里显示的那些繁杂的步骤已经不需要了: 第一步需要先申请,申请地址如下: ...

  2. OpenCV2学习笔记05:矩阵翻转

    对图像进行翻转或旋转可以使用cv::flip()函数,可以实现将一个二维矩阵沿X轴.Y轴或者同时沿XY轴翻转.函数原型如下: C++: void flip(InputArray src, Output ...

  3. Live帐号登陆win8系统不用输密码的方法

    win 8 系统旨在让大家日常的操作更加方便与快捷.因此,今天,小编将与大家分享的是如何利用Live帐号登陆win8系统,而不用输密码的方法.具体的步骤如下文所述. 按win+R打开运行输入cmd(在 ...

  4. object-c 1

    多个参数的写法 (方法的数据类型)函数名:(参数1数据类型)参数1的数值的名字 参数2的名字: (参数2数据类型) 参数2值的名字 …. ; 举个例子,一个方法的定义: -(void) setKids ...

  5. DELPHI 取文件名和扩展名

    x:=ExtractFileName(str);  //取文件名+扩展名,不包含文件路径 y:=ExtractFileExt(str);   //取文件的扩展名

  6. VS2013 调试卡顿

    今早好奇安装了花生壳远程控制软件.然后下午莫名的感觉到vs2013 调试特别的卡顿.会每隔1s中请求一次的那种卡顿于是卸载了花生壳控制软件,发现问题依旧.然后重启机器 ok了.果然不卡顿了. 我回忆了 ...

  7. hdu 3157 Crazy Circuits 有源汇和下界的最小费用流

    题目链接 题意:有n个节点,m个用电器.之后输入m行每行三个整数a,b,c; 节点a为正极(或者a 为 '+'即总的正极),b为该用电器的负极(b = '-'表示总的负极),c为该用电器要正常工作最小 ...

  8. 事件——《JS高级程序设计》

    一. 事件流 1. 事件流描述的是从页面中接收事件的顺序 2. 事件冒泡(event bubble):事件从开始时由最具体的元素(就是嵌套最深的那个节点)开始,逐级向上传播到较为不具体的节点(就是Do ...

  9. 如何创建phpinfo查看php信息?

    创建一个简单的文本文档并命名为phpinfo.php   代码如下: <?php phpinfo(); ?>   将上面的代码写入并保存该文档,通过浏览器访问这个文件即可显示PHP信息  

  10. java的装箱与拆箱

    在 JDK1.5 引入自动装箱和拆箱的机制后,包装类和基本类型之间的转换就更加轻松便利了.那什么是装箱和拆箱呢?我们分别来看下装箱:把基本类型转换成包装类,使其具有对象的性质,又可分为手动装箱和自动装 ...