这几天在网上看到一种创建网站的思想,名字叫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来调用。
相关推荐
5. **项目结构**:一个典型的Spring MVC Maven项目结构包括`src/main/java`(存放源代码)、`src/main/resources`(存放配置文件和静态资源)、`src/main/webapp/WEB-INF`(存放`web.xml`配置文件)等。 6. **配置...
总结来说,JAX-RS提供了一种简洁、直观的方式来创建RESTful Web Service。通过注解,我们可以轻松地定义资源、操作以及数据交换格式,而无需复杂的配置或底层HTTP处理。结合一个实现库,如Jersey,我们可以快速搭建...
总结来说,使用Jersey框架和Apache Tomcat服务器构建RESTful Web服务,不仅可以充分利用Java生态系统的强大功能,还能确保服务的扩展性、可维护性和高性能。通过使用Jersey的注解和API,开发者能够快速创建符合REST...
在RESTful.NET中,`restService`是核心概念之一,它代表了一个服务端的资源处理单元。通过定义RESTful接口,开发者可以构建出易于理解、可维护的API。RESTful服务通常由一组URI(统一资源标识符)组成,每个URI对应...
restful restful所需要的jar包 ========================================= Restlet, a RESTful Web framework for Java ========================================= http://www.restlet.org -------------------...
在本项目中,我们将探讨如何使用Spring Boot框架创建一个简单的RESTful Web Service。Spring Boot以其简洁的配置和快速开发能力,已经成为Java开发人员构建微服务的首选工具。RESTful Web Service是一种基于HTTP协议...
在本文中,我们将深入探讨如何将Jetty与RestEasy结合,以开发高效的RESTful Web服务。Jetty是一款轻量级、高性能的Java Servlet容器,而RestEasy是JAX-RS(Java API for RESTful Web Services)的一个实现,使得创建...
1. **资源表示(Resources and Representations)**:RESTful服务的核心是资源,通常以URI表示。源码中会包含定义资源的Java类,它们通过注解(如`@Path`)来指定对应的URL路径。 2. **HTTP方法映射...
REST 中最重要的概念是资源(resources),使用全球ID(通常使用URI)标识。客户端应用程序使用HTTP方法(GET/POST/PUT/DELETE)操作资源或资源集。 Jersey和JAX-RS -------------- JSR 311或JAX-RS(用于RESTful ...
- **503 Service Unavailable**:服务器目前无法使用(由于超载或停机维护)。 通过上述介绍,我们可以看出RESTful API 设计的基本原则及其重要性。合理的URI设计、清晰的HTTP动词使用以及正确的状态码返回,不仅...
- `Resources`:表示资源的Java类,这些类通常会继承自Java的`javax.ws.rs.core.Resource`或者使用JAX-RS(Java API for RESTful Web Services)框架如Jersey或RESTEasy提供的注解来定义资源方法。 - `Component`:...
RESTful服务的四个基本组件包括资源(Resources)、URI(Uniform Resource Identifiers)、表示(Representations)和操作(Methods)。资源是服务的核心,通过URI定位;表示是资源的当前状态,可以是JSON、XML等...
在src/main/resources目录下创建mapper目录,为每个Mapper接口编写对应的XML文件,编写SQL语句。 6. **配置Mapper扫描** 在Spring Boot的主配置类上添加`@MapperScan`注解,指定Mapper接口所在的包。 7. **创建...
3. `src/main/resources`:配置文件目录,可能有Spring的配置文件如`applicationContext.xml`或Spring Boot的`application.properties`。 4. `webapp/WEB-INF/web.xml`:对于非Spring Boot项目,这里会包含Servlet...
本项目“restfulservice”可能是一个使用这些框架创建的示例应用。 首先,我们需要理解REST的基本原则: 1. **资源(Resources)**:在REST架构中,一切皆为资源,每个资源都有一个唯一的URI(Uniform Resource ...
- src/main/resources:存储配置文件,如application.properties或xml配置。 - WEB-INF:包含web.xml文件,这是Spring MVC的部署描述符,用于配置应用的入口点和Spring的DispatcherServlet。 - Maven或Gradle的配置...
REST架构强调资源(Resources)的概念,并通过统一接口进行操作。 2. **RESTful服务特点**: - **无状态性**:每个请求都包含了解该请求所需的所有信息,服务器不会保存任何客户端状态。 - **客户端-服务器模型**...
在IT行业中,RESTful Web Service和Spring框架的集成是一个广泛使用的解决方案,特别是在构建现代、可扩展的分布式系统中。REST(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,基于...
- **资源(Resources)**: RESTful 服务的核心是资源,每个 URL 代表一个特定的资源。 - **统一接口(Uniform Interface)**: 提供简单的、一致的交互方式,包括 CRUD(Create, Read, Update, Delete)操作。 - *...
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 ...