什么是REST

REST 全称是 Representational State Transfer(表述性状态转移),它是 Roy Fielding 博士在 2000 年写的一篇关于软件架构风格的论文。许多知名互联网公司开始采用这种轻量级 Web 服务,大家习惯将其称为 RESTful Web Services,或简称 REST 服务。

REST 本质上是使用 URL 来访问资源的一种方式。总所周知,URL 就是我们平常使用的请求地址了,其中包括两部分:请求方式 与 请求路径,比较常见的请求方式是 GET 与 POST,但在 REST 中又提出了几种其它类型的请求方式,汇总起来有六种:GET、POST、PUT、DELETE、HEAD、OPTIONS。尤其是前四种,正好与 CRUD(增删改查)四种操作相对应:GET(查)、POST(增)、PUT(改)、DELETE(删)。

实际上,REST 是一个“无状态”的架构模式,因为在任何时候都可以由客户端发出请求到服务端,最终返回自己想要的数据。也就是说,服务端将内部资源发布 REST 服务,客户端通过 URL 来访问这些资源,这不就是 SOA 所提倡的“面向服务”的思想吗?所以,REST 也被人们看做是一种轻量级的 SOA 实现技术,因此在企业级应用与互联网应用中都得到了广泛使用。

在 Java 的世界里,有一个名为 JAX-RS 的规范,它就是用来实现 REST 服务的。目前有许多框架已经实现了该规范,比如restlet、cxf。

restlet可以单独使用,也可以与springframework继承一起使用,下面讲解第二种。

使用 Spring + restlet 发布 REST 服务

添加maven依赖

<dependencies><!-- Spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><!-- restlet --><dependency><groupId>org.restlet.jee</groupId><artifactId>org.restlet</artifactId></dependency><dependency><groupId>org.restlet.jee</groupId><artifactId>org.restlet.ext.jackson</artifactId><exclusions><exclusion><groupId>org.codehaus.woodstox</groupId><artifactId>woodstox-core-asl</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.restlet.jee</groupId><artifactId>org.restlet.ext.servlet</artifactId></dependency><dependency><groupId>org.restlet.jee</groupId><artifactId>org.restlet.ext.spring</artifactId></dependency>
</dependencies>

这里仅依赖 Spring Web 模块(无需 MVC 模块)。

配置web.xml

<context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:META-INF/spring/*.service.xml/WEB-INF/classes/*.datasource.xml /WEB-INF/classes/*.service.xmlclasspath*:conf/*.service.xmlclasspath*:*.service.xml  </param-value>
</context-param>......<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet><servlet-name>restlet</servlet-name><servlet-class>org.restlet.ext.spring.RestletFrameworkServlet</servlet-class><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>restlet</servlet-name><url-pattern>/*</url-pattern>
</servlet-mapping>

使用 Spring 提供的 ContextLoaderListener 去加载所有的配置文件*.xml;使用 restlet 提供的 RestletFrameworkServlet 去处理前缀为所有的 REST 请求。

定义Resource资源类

@Controller("backupPolicyCreateAndQuery")
@Scope("prototype")
public class BackupPolicyCreateAndQuery extends ServerResource
{@Postpublic BackupPolicyCreateResponse createPolicy(BackupPolicyCreateRequest request){......}
}

创建resource代码类,要继承org.restlet.resource.ServerResource,用@Get和@Post注解来什么类型的请求

配置spring文件

下面只举一个示例,spring配置相信大家都比较熟悉了,就不多说

<context:component-scan base-package="com.huawei.hwclouds.autobackup"/>
<context:annotation-config /><bean id="scheduleConfigs"class="org.springframework.beans.factory.config.PropertiesFactoryBean"><property name="locations"><list><value>classpath:service.config.properties</value></list></property>
</bean> <bean id="scheduler"class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="no"><property name="configLocation" value="classpath:quartz.properties" />
</bean>......

将接口的实现类发布为SpringBean

有两种方式:一是使用spring配置文件;一是使用注解。这里采用第二种,如上面定义Resource资源类所示:

创建restlet-servlet.xml

在web.xml同目录下创建{name}-servlet.xml,其中name为web.xml中定义的servlet名称

<bean name="root" class="org.restlet.ext.spring.SpringRouter"><property name="attachments"><map><!-- 此处可以按业务模块划分url v1 or v2 --><entry key="/v1/{tenant}" value-ref="v1Route" /><entry key="/v2/{tenant}" value-ref="v2Route" /><entry key="/server_status"><bean class="org.restlet.ext.spring.SpringFinder"><lookup-method name="create" bean="autoBackupStatusResource" /></bean></entry></map></property>
</bean><bean id="v1Route" class="org.restlet.ext.spring.SpringRouter"><property name="attachments"><map><entry key="/backuppolicy"><bean class="org.restlet.ext.spring.SpringFinder"><lookup-method name="create"bean="backupPolicyCreateAndQuery" /></bean></entry></map></property>
</bean>

这个文件主要是配置url的路径对应的资源bean,可以看到,这里的bean也是可以引用的。

使用SpringFramework+Restlet实现rest服务相关推荐

  1. 用Restlet创建面向资源的服务

    http://www.infoq.com/cn/articles/restlet-for-restful-service Restlet项目(http://www.restlet.org)为" ...

  2. maven netty 配置_springboot2.3手册:5分钟用Netty搭建高性能异步WebSocket服务

    互联网应用架构:专注编程教学,架构,JAVA,Python,微服务,机器学习等领域,欢迎关注,一起学习. 断更快两个月了,6月份工作忙到飞起,7月份家里又有事,已经累到躺下就想睡觉的程度了. 现在我们 ...

  3. SSM启动服务时将数据存入缓存

    使用场景: 页面要调用的是后端数据量非常大的接口,并且时间较长,这时项目没有缓冲功能(例如redis),那么如果每次实时取数据给客户的体验是非常不好的,这时我们可以按如下代码,在初始化的时候就去数据库 ...

  4. Eclipse构建Maven分包分模块项目并构建服务端

    首先说一下Maven 模块结构: 一个简单的Maven模块结构是这样的: ---- app-parent 一个父项目(app-parent)聚合很多子项目(app-util,app-dao,app-s ...

  5. 疯狂Spring Cloud微服务架构实战

    网站 更多书籍点击进入>> CiCi岛 下载 电子版仅供预览及学习交流使用,下载后请24小时内删除,支持正版,喜欢的请购买正版书籍 电子书下载(皮皮云盘-点击"普通下载" ...

  6. springboot2.3手册:5分钟用Netty搭建高性能异步WebSocket服务

    溪云阁:专注编程教学,架构,JAVA,Python,微服务,机器学习等领域,欢迎关注,一起学习. 断更快两个月了,6月份工作忙到飞起,7月份家里又有事,已经累到躺下就想睡觉的程度了. 现在我们做Web ...

  7. 微服务精通之Hystrix原理解析

    前言 经过微服务精通之Ribbon原理解析的学习,我们了解到了服务消费者获取服务提供者实例的过程,在这之后,服务消费者会调用服务提供者的接口.但是在调用接口的过程中,我们经常会遇见服务之间的延迟和通信 ...

  8. 二. 微服务的高级进阶

    二. 微服务的高级进阶 1. Ribbon API和负载均衡算法 1. Ribbon API Ribbon 是一个独立的组件,是用来进行远程接口调用的,代码如下 @Slf4j @Service @Sc ...

  9. 花一周时间,啃完这套京东架构师独家微服务笔记,成功面进字节

    前言 基于 Spring Cloud 的微服务设计和开发,已经越来越多地得到了更多企业的推广和应用,而 Spring Cloud 社区也在不断的迅速发展壮大之中,近几年时间,Spring Cloud ...

最新文章

  1. tensorflow 代码阅读
  2. 客户流失预警模型-GBDT模型
  3. Android开发之解决NestedScrollView滑动监听兼容低版本的方法
  4. 6-7 使用函数输出水仙花数_「Java」再议printf函数
  5. html 变量类型强制转换,html、js前台数据传到后台,spring复杂类型转换
  6. 进入 App Store 打分
  7. 计算机三级——数据库技术真题知识点
  8. 中国天气网城市代码(全,已验证)
  9. VISUAL STUDIO调试器指南---断点和跟踪点
  10. Google Scanned Objects: A High-Quality Dataset of 3D Scanned Household Items【google 3D数据集】
  11. canvas制作简单表格
  12. 【运筹学】对偶理论 : 影子价格 ( 对偶问题的经济解释 )
  13. SQL中的PROCEDURE
  14. 人工神经网络算法的应用,神经网络算法应用案例
  15. 2022-2028全球与中国数据虚拟化解决方案市场现状及未来发展趋势
  16. python调用AI百度开放平台API
  17. SkiaSharp 之 WPF 自绘 拖曳小球(案例版)
  18. 复习笔记5-nginx、rabbitmq、redis、jenkins、Docker、ELK、日志、Hadoop
  19. Qt: 表格(QTableWidget)隐藏自动生成的序号列(行头)
  20. mac必备的mac解压缩软件:BetterZip for mac中文版

热门文章

  1. 【CarMaker学习笔记】TestManager自动测试实验
  2. Java学习之性能优化常用方法分享
  3. 这半年没批版号了,那些手游是怎么通过广电审核这一关并成功上架的?
  4. python版本切换
  5. 智能终端设备防破解该怎么防范
  6. 从技术专家到总经理,在不确定中探索和成长
  7. 按照老师的方式,将四分位距的统计学异常检测如法炮制
  8. P2P网贷平台运营必知
  9. sqlite developer注册码
  10. Linux系统使用教程