Java RESTful Web Service实战(第2版) 1.7 Java领域的其他REST实现
1.7 Java领域的其他REST实现
Java领域存在很多REST实现,我们以是否遵循JAX-RS标准,将它们分为两组。前者是JAX-RS标准参考实现之外的厂商实现,后者要么是因为出现较JAX-RS标准早,要么干脆跳出了JAX-RS标准的定义,以自身框架一致性为目标,实现了一套独有的对REST开发的支持。本节将概括性地介绍这些实现工具,以便读者有所对比和选择。
1.7.1 JAX-RS的其他实现
JAX-RS标准发布后,诸多厂商推出了自己的基于JAX-RS标准的实现。其中最有影响力的当属来自JBoss社区的RESTEasy和来自Apache社区的CXF。本节将简述这两个项目。如果读者的项目确实和它们结合得紧密,Jersey未必是最佳选择,读者尽可拥抱这两个基于JAX-RS标准的项目。
1. JBoss的RESTEasy
RESTEasy是JBoss社区提供的JAX-RS项目。JBoss这一名词目前已经不再代表Java EE容器,曾经的JBoss已经更名为WildFly。现在,JBoss特指RedHat公司旗下的开源社区。RESTEasy自2009年1月第一个GA版本以来,发展到3.0.x,从版本3.0.0.Final开始支持JAX-RS2.0。RESTEasy的基本信息如下。
官方网站:http://resteasy.jboss.org。
官方文档:提供单页面HTML、按章节HTML和PDF 3种格式,可以按照阅读习惯选择。地址为http://resteasy.jboss.org/docs.html。
源代码:由GitHub托管,地址为https://github.com/resteasy/Resteasy。
缺陷管理:地址为https://issues.jboss.org/projects/RESTEASY,隶属于JBoss开发者社区的JIRA系统。
项目下载:由sourceforge托管,地址为http://sourceforge.net/projects/resteasy/files/Resteasy%20JAX-RS。维护的最后一个版本是3.0.9.Final,日期为2014-09-17,而目前RESTEasy的最新版本为3.0.13.Final。
(1)快速开始
最快速地了解一个新框架的办法,一定是从官方提供的示例开始。我们首先迁出RESTEasy的源代码,然后进入示例目录,选择最易上手的示例项目。 这里以resteasy-springMVC为例,示例操作如下。
git clone https://github.com/resteasy/Resteasy.git
cd Resteasy/jaxrs/examples/resteasy-springMVC
mvn clean install
mvn jetty:run
上述操作分别执行了代码迁出、进入示例目录、构建示例项目和启动示例服务。当服务启动完毕后,我们可以在浏览器的地址栏输入http://localhost:8080/contacts,在页面中输入测试数据并提交表单,这里提交的是Eric和Han。测试数据会被保存在REST服务的内存中,可以通过如下GET请求获取服务端保存的数据,示例结果如下。
curl http://localhost:8080/contacts/data/Han
?xml version="1.0" encoding="UTF-8" standalone="yes"?
contact
firstName Eric /firstName lastName Han /lastName/contact
从上面的测试结果中,我们得到了lastName为Han,XML格式的contact资源数据。
(2)简单分析
这个示例项目是非常典型的JAX-RS实践。观察如下所示的目录树,源代码路径中包含了4个类,其中Contact和Contacts是实体类,ContactService是服务类,ContactsResource是REST服务的资源类,负责定义REST接口。单元测试类ContactsTest是对ContactsResource功能的全面测试。
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── org
│ │ └── jboss
│ │ └── resteasy
│ │ └── examples
│ │ └── springmvc
│ │ ├── Contact.java
│ │ ├── ContactService.java
│ │ ├── Contacts.java
│ │ └── ContactsResource.java
│ ├── resources
│ │ └── springmvc-servlet.xml
│ └── webapp
│ └── WEB-INF
│ ├── contacts.jsp
│ └── web.xml
└── test
└── java
└── org
└── jboss
└── resteasy
└── examples
└── springmvc
└── ContactsTest.java
示例项目所依赖的包简述如下。
org.jboss.resteasy
resteasy-spring:支持RESTEasy与Spring集成,底层依赖resteasy-jaxrs。resteasy-jaxrs是RESTEasy的JAX-RS核心包。
resteasy-client:RESTEasy客户端包。
resteasy-jaxb-provider:RESTEasy的XML处理包。
org.jboss.spec.javax.servlet
jboss-servlet-api_3.1_spec:RESTEasy的JBoss Servlet实现。
org.springframework
spring-webmvc:Spring MVC包。
2. Apache的CXF
CXF是Apache开源社区提供的JAX-RS项目,CXF的名称是由Celtix项目和XFire项目合并而来。其中Celtix由IONA Technologies开发,XFire来自Codehaus。CXF是JAX-WS的著名实现,同时实现了JAX-RS,从版本2.7.0开始几乎全面支持JAX-RS2.0全部特性。从版本3.0.0开始实现JAX-RS2客户端API。CXF的基本信息如下。
官方网站:http://cxf.apache.org。
官方文档:http://cxf.apache.org/docs/jax-rs.html。
项目下载:Apache CXF当前版本是3.1.3。下载地址为http://cxf.apache.org/download.html。
源代码:由Apache的GIT服务器托管,地址为https://git-wip-us.apache.org/repos/asf?p= cxf.git;另有一个自动镜像由GitHub托管,地址为https://github.com/apache/cxf。
邮件列表:http://cxf.apache.org/mailing-lists.html。
(1)快速开始
我们依然从官方提供的示例开始。首先迁出CXF的源代码,然后进入示例目录,这里选择的示例项目为jaxrs_spring_boot,示例操作如下。
git clone https://git-wip-us.apache.org/repos/asf/cxf.git
git clone https://github.com/apache/cxf.git
cd cxf/distribution/src/main/release/samples/jax_rs/jaxrs_spring_boot
mvn spring-boot:run
可以从上述的前2行中选择一个地址,将CXF源代码迁出。进入jaxrs_spring_boot目录,然后执行maven命令,启动基于spring-boot的REST服务。服务启动后,我们在另一个终端中使用cURL测试,将得到如下的输出。
curl ":8080/services/helloservice/sayHello/ApacheCxfUser"
Hello ApacheCxfUser, Welcome to CXF RS Spring Boot World!!!
(2)简单分析
该示例项目也是典型的JAX-RS实践。观察如下所示的目录树,HelloService是资源类,SampleRestWSApplication是服务器端包含main方法的入口类,SampleRestClientApplication是客户端包含main方法的入口类。
├── pom.xml
└── src
└── main
└── java
└── sample
└── rs
├── client
│ └── SampleRestClientApplication.java
└── service
├── HelloService.java
└── SampleRestWSApplication.java
示例项目所依赖的包简述如下。
spring-boot:Spring-boot启动包
org.springframework.boot:spring-boot-starter
org.springframework.boot:spring-boot-starter-web
cxf:CXF包
org.apache.cxf:cxf-rt-frontend-jaxrs
org.apache.cxf:cxf-rt-rs-client
org.apache.cxf:cxf-rt-transports-http
org.apache.cxf:cxf-rt-rs-service-description
jackson:JSON处理包
com.fasterxml.jackson.core:jackson-core
com.fasterxml.jackson.core:jackson-databind
com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider
com.fasterxml.jackson.core:jackson-annotations
jetty:Servlet容器Jetty包
org.eclipse.jetty:jetty-servlet
org.eclipse.jetty:jetty-webapp
org.eclipse.jetty:jetty-servlets
1.7.2 其他的REST实现
本节将介绍Java领域,没有遵循JAX-RS规范的REST式Web服务开发工具,包括Restlet、LinkedIn的Rest.li以及Spring MVC。
1. Restlet项目
Restlet是一款遵从REST风格的、基于Java平台的轻量级框架,当前版本为2.3。Restlet许可为免费开源,提供REST开发的完整支持。Restlet的基本信息如下。
官方网站:http://restlet.org。
源代码:由GitHub托管,地址为https://github.com/restlet/restlet-framework-java。
StackOverflow:http://stackoverflow.com/questions/tagged/restlet。
学习指南文档:http://restlet.org/learn/tutorial。
(1)快速开始
为了快速了解Restlet的使用,我们从一个现成的Restlet示例项目开始学习,示例如下。
wget http://restlet.com/technical-resources/restlet-framework/archives/examples/maven-spring/2.3/restlet-basecamp.zip
unzip restlet-basecamp.zip
cd restlet-basecamp
mvn jetty:run-war
上述操作分别执行了下载示例包、解压缩、进入示例项目目录以及启动服务。服务启动后,我们使用cURL测试,将得到如下的输出。
curl ":8080/basecamp/hello"
Hello World!
(2)简单分析
Restlet使用配置文件声明服务,我们观察如下所示的目录树,applicationContext.xml是配置文件,BaseCampApplication是REST服务入口类,BaseCampResource是资源类。
├── pom.xml
└── src
└── main
├── java
│ └── com
│ └── mycompany
│ └── restlet
│ └── basecamp
│ ├── application
│ │ └── BaseCampApplication.java
│ └── resource
│ └── demo
│ └── BaseCampResource.java
├── resources
└── webapp
└── WEB-INF
├── applicationContext.xml
└── web.xml
配置文件applicationContext.xml展示如下,首先需要定义一个Spring组件basecamp-Component,它的defaultTarget属性指向BaseCampApplication的实例basecampAppliction。basecampAppliction的根路径路由指向SpringBeanRouter的实例。最后,/hello路径指向BaseCampResource的实例。
bean id="basecampComponent"
property name="defaultTarget" ref="basecampAppliction" //bean
bean id="basecampAppliction"
property name="root" ref="router" //bean
!-- Define the router --
bean name="router" /
!-- Define all the routes --
bean name="/hello" scope="prototype" autowire="byName" /
示例项目所依赖的包简述如下。
org.restlet.jee:org.restlet:jar:2.0.1
org.restlet.jee:org.restlet.ext.servlet:jar:2.0.1
org.restlet.jee:org.restlet.ext.spring:jar:2.0.1
org.springframework:spring-webmvc:jar:3.0.1.RELEASE。
其中,jee代表支持Java EE平台的包。此外,Restlet支持的平台体系如下。
jse (Java SE edition)
jee (Java EE edition)
gae (Google App Engine edition)
android (Android edition)
gwt (Google Web Toolkit edition)
osgi (OSGi Environments edition)
2. LinkedIn的Rest.li
Rest.li是社交网站LinkedIn开发的REST+JSONREST式服务框架。rest.li基本信息如下。
官方地址:rest.li(http://rest.li)。
源代码:由GitHub托管,地址为https://github.com/linkedin/rest.li。
wiki:https://github.com/linkedin/rest.li/wiki。
快速开始教学文档:https://github.com/linkedin/rest.li/wiki/Quickstart:-A-Tutorial-Introduction-to-Rest.li。
快速开始
Rest.li的项目是使用Gradle构建的,完整的代码迁出和构建示例如下。
git clone https://github.com/linkedin/rest.li.git
cd rest.li/examples/spring-server
gradle build
gradle JettyRunWar
curl -v http://localhost:8080/fortunes/1
3. Spring MVC项目
Spring框架使用Gradle构建和管理项目,使用GIT管理源代码,地址为https://github.com/spring-projects/spring-framework,其中MVC模块位于spring-framework/spring-webmvc目录下。
Spring从版本3.0开始提供了对REST式应用开发的支持,但Spring目前并没有也没必要推出一个实现JAX-RS标准的模块。MVC模块提供的REST功能并没有采用JAX-RS提出的标准。本质上,Spring MVC控制流程是使用Controller处理Model在某种动词性的业务逻辑操作,而JAX-RS的控制流程是使用资源类Resource处理名词性的资源表述。
在云概念和微服务大行其道的今天,Spring Boot成为依赖spring-framework项目的事实标准。本书的第7章将讲述Spring Boot在REST服务领域中的影响力及实践。
SpringBoot轻松整合WebSocket,实现Web在线聊天室 前面为大家讲述了 Spring Boot的整合Redis、RabbitMQ、Elasticsearch等各种框架组件;随着移动互联网的发展,服务端消息数据推送已经是一个非常重要、非常普遍的基础功能。今天就和大家聊聊在SpringBoot轻松整合WebSocket,实现Web在线聊天室,希望能对大家有所帮助。
Python 实现Web容器指纹识别 当今的Web安全行业在进行渗透测试时普遍第一步就是去识别目标网站的指纹,从而进一步根据目标框架进行针对性的安全测试,指纹识别的原理其实很简单,目前主流的识别方式有下面这几种。
web端实现AR人脸特效 直播、短视频、在线会议等应用越来越多地进入人们的生活,随之诞生的是丰富的各类创意玩法与新鲜体验,其中大量应用了以AI检测和图形渲染为基础的AR技术。
相关文章
- MySQL_(Java)【连接池】简单在JDBCUtils.java中创建连接池
- Java IO--字节流与字符流OutputStream/InputStream/Writer/Reader
- Java实现 LeetCode 537 复数乘法(关于数学唯一的水题)
- Java实现 LeetCode 482 密钥格式化
- Java实现 LeetCode 403 青蛙过河
- Java实现蓝桥杯 算法训练 大等于n的最小完全平方数
- Java实现第八届蓝桥杯杨辉三角
- java实现手机尾号评分
- Java实现 蓝桥杯VIP 算法提高 现代诗如蚯蚓
- java 11 Java Flight Recorder
- 【JAVA】java中的length和length()
- 【JAVA】 01-Java基础知识
- 【Java】java使用反射访问对象方法和成员变量
- 自己写的一段预测双色球号码的Java代码
- Atitit 部署了个webdav服务 as root 目录 1.1. WEB-INF copy to root dir only a web.xml use...1 1.2. Java.ba
- 当年的java考试:Java景区预约登记管理系统(maven整合servlet)
- 【java】Java 包(package)
- 深度解析为什么做深度学习,都用python,而不用java或者c++
- java.lang.OutOfMemoryError: Java heap space错误及处理办法(收集整理、转)
- Java RESTful Web Service相关概念
- Java开发技术之成为高级java工程师必须学习的三个技术
- JAVA--泛型复习
- 【java】Java 重写(Override)与重载(Overload)
- JAVA开发讲义(一)-Java的自白