`
frand_feng
  • 浏览: 18926 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

RESTful service resources总结

 
阅读更多

    这几天在网上看到一种创建网站的思想,名字叫RESTful service resources觉得特别好用,比struts架构更简单容易,所以搜了一些资料总结一下其概念与用法:

    先看看RESTful service resources的思想:

    如果要说什么是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有一些最基本的了解,由于REST应用的这些约束,我们可以很轻易的了解和使用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框架

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

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

  如何使用Jersey来快速创建REST应用,参见通过Jersey快速构建REST应用(https://jersey.java.net/nonav/documentation/latest/getting-started.html)如何使用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来调用。

分享到:
评论

相关推荐

    restful restful所需要的jar包

    restful restful所需要的jar包 ========================================= Restlet, a RESTful Web framework for Java ========================================= http://www.restlet.org -------------------...

    RESTful.Java.Web.Services.Security

    Learn how to use, configure, and set up tools for applications that use RESTful web services to prevent misuse of resources Get to know and fix the most common vulnerabilities of RESTful web services ...

    RESTful Web Services.rar

    Some Resources for REST and Some RESTful Resources.. . . . 365 Standards and Guides 365 Services You Can Use 367 B. The HTTP Response Code Top 42....371 Three to Seven Status Codes: The Bare ...

    RESTFUL BEST PRACTICES

    There are numerous resources on best practices for creating RESTful web services (see the Resources section at the end of this document). Many of the available resources are conflicting, depending on ...

    SpringBoot-Restful-Web-Service-Sample:SpringBoot Restful Web Service示例模拟了简单的2个事务操作

    SpringBoot Restful Web服务示例 这个宁静的WS有2个端点: 交易后 http://localhost:9005/transactions 如果时间戳比以前的60秒新,则只允许发布请求并接受事务。 如果请求符合保存条件,它将返回HTTP状态代码201...

    前端项目-restangular.zip

    前端项目-restangular,Restful Resources service for AngularJS apps

    REST架构的网络服务

    中文名: REST架构的网络服务 原名: RESTful Web Services ...Appendix Some Resources for REST and Some RESTful Resources Appendix The HTTP Response Code Top 42 Appendix The HTTP Header Top Infinity Colophon

    Java-Web-Service:带有JAX-RS的示例RESTful API(在MySQL数据库上实现基本的HTTP方法)

    带有JAX-RS的示例RESTful API(在MySQL数据库上实现基本的HTTP方法)。 ##一些东西 使用Maven。 因此,请相应地导入。 不涉及身份验证。 (就这么简单。) 没有数据库持久性或连接池完成。 不进行内容协商(仅...

    okhelper-service:OK帮云进销存(SpringBoot Restful全家桶)

    okhelper服务OK帮云进销存是一个云进销存平台,项目整体采用Vue + Java RESTful前重新分离架构开发,将核心框架为SpringBoot + MyBatis + ApacheShiro设计文档: : 云端接口文档: ://coderzc.github.io/okhelperapi...

    Java.EE.7.Essentials

    View and Delete Movies (Java API for RESTful Web Services) Add Movie (Java API for JSON Processing) Ticket Sales (Batch Applications for the Java Platform) Movie Points (Java Message Service 2) ...

    基于ssm+shiro+redis+nginx tomcat服务器集群管理项目源码+项目说明.zip

    6.采用RESTFul的controller接口,展示RESTFul风格的API编写(shiro基于url的权限拦截与RESTFul API兼容性不好,后期可能会改写shiro以匹配RESTFul) 7.Junit单元测试,展示如何正确的使用Junit单元测试验证自己...

    The Java EE 6 Tutorial Basic Concepts 4th Edition

    Creating a Simple Web Service and Clients with JAX-WS 208 Types Supported by JAX-WS 217 Web Services Interoperability and JAX-WS 217 Further Information about JAX-WS 217 Chapter 13: Building ...

    ASP.NET Web API and Angular 2(PACKT,2016)

    Writing APIs goes some way to striking a balance, as you can have an API that feeds data from your back-end to front-end service for consumption. Now, this front-end can change to a mobile app, a ...

    Mastering.Spring.Cloud

    Creating RESTful Web Services API Documentation Using Swagger 2 together with Spring Boot Testing API with Swagger UI Spring Boot Actuator features Application information Health information Metrics ...

    ASP.NET.Web.API.and.Angular.2.17864

    Writing APIs goes some way to striking a balance, as you can have an API that feeds data from your back-end to front-end service for consumption. Now, this front-end can change to a mobile app, a ...

    JAVA毕业设计之springboot011课程作业管理系统(springboot+mysql)完整源码.zip

    存放控制器类service:存放服务类dao:存放数据访问对象entity:存放实体类util:存放工具类src/main/resources:存放资源文件application.properties:配置文件static:存放静态资源,如HTML、CSS、JS等template:...

    atp:EdgeGallery应用程序测试和验证的后端服务

    atp-be对外提供RESTful接口,基于开源的ServiceComb微服务框架进行开发,并集成了Spring Boot框架。本地运行需要依赖ServiceCenter进行服务注册发现,通过postman进行接口测试。 环境准备(本地运行) 姓名 版本 ...

    malamute:部署记录器服务-记录和记录新产品版本的发布

    该项目的核心是使用Scala和开发的,提供了通过记录的RESTful API。 一个Web应用程序,用于查看在和内置的信息。 此外,还有一个 ,可轻松集成到基于Ruby的系统中。屏幕截图项目仪表板项目部署项目模块部署细节 配置...

    the-spring-rest-stack:有关构建更强大的REST API的演讲的平台

    这段代码附带了我在Spring上进行的RESTful服务开发的演讲。 有在线版本的演讲。 值得注意的是,我以介绍了它。 请参阅。 这段代码位于。 该项目的目的是演示如何使用Spring开发简单的REST服务。 REST服务与简单...

    enterprise_rails.pdf

    18. A RESTful Web Service ................................................. 279 Scoping the Problem 279 Tools 281 MoviesWebService 284 Resources Server Implementation 285 Actions Server Implementation...

Global site tag (gtag.js) - Google Analytics