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"
class="org.restlet.ext.spring.SpringComponent">

 
<property name="defaultTarget"
ref="basecampAppliction" />

</bean>

 

<bean id="basecampAppliction"
class="com.mycompany.restlet.basecamp.application.BaseCampApplication">

 
<property name="root" ref="router" />

</bean>

 

<!-- 
Define the router -->

<bean name="router"
class="org.restlet.ext.spring.SpringBeanRouter" />

 

<!-- Define all the routes -->

<bean name="/hello"
class="com.mycompany.restlet.basecamp.resource.demo.BaseCampResource"
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服务领域中的影响力及实践。

时间: 2025-01-21 12:41:28

Java RESTful Web Service实战(第2版) 1.7 Java领域的其他REST实现的相关文章

Java RESTful Web Service实战(第2版)

Java核心技术系列 Java RESTful Web Service实战 (第2版) 韩陆 著 图书在版编目(CIP)数据 Java RESTful Web Service实战 / 韩陆著. -2版. -北京:机械工业出版社,2016.7 (Java核心技术系列) ISBN 978-7-111-54213-1 Ⅰ. J-   Ⅱ. 韩-   Ⅲ. JAVA语言-程序设计   Ⅳ. TP312 中国版本图书馆CIP数据核字(2016)第156331号 Java RESTful Web Servi

Java RESTful Web Service实战(第2版) 导读

Java核心技术系列 Java RESTful Web Service实战 (第2版) 韩陆 著   半年前初识韩陆的时候,我们就聊到他正在写的这本书,当得知我从2006年就参与了Apache CXF开发,他立即邀请我为他的新书写序,我也就欣然答应了. Apache CXF作为JAXWS以及JAX-RS规范的实现框架,已经成为很多Web服务开发者必选的开发框架.作为这一框架的开发维护者之一,我的日常工作经常需要熟悉这些JSR规范,并实现JSR所定义的API,解决最终用户的使用问题. 熟悉Java

Java RESTful Web Service实战(第2版) 2.3 传输格式

2.3 传输格式 本节要考虑的就是如何设计表述,即传输过程中数据采用什么样的数据格式.通常,REST接口会以XML和JSON作为主要的传输格式,这两种格式数据的处理是本节的重点.那么Jersey是否还支持其他的数据格式呢?答案是肯定的,让我们逐一掌握各种类型的实现. 2.3.1 基本类型 Java的基本类型又叫原生类型,包括4种整型(byte.short.int.long).2种浮点类型(float.double).Unicode编码的字符(char)和布尔类型(boolean). 阅读指南 本

Java RESTful Web Service实战(第2版) 1.2 解读REST服务

1.2 解读REST服务 RESTful对应的中文是REST式的,RESTful Web Service的准确翻译应该是REST式的Web服务,我们通常简称为REST服务.RESTful的应用或者Web服务是最常见的两种REST式的项目部署.存在的方式.本节将介绍REST服务并对比其与传统Web Services的不同. 1.2.1 REST式的Web服务 RESTful Web Service是一种遵守REST式风格的Web服务.REST服务是一种ROA(Resource-Oriented A

Java RESTful Web Service实战(第2版) 1.3 解读JAX-RS标准

1.3 解读JAX-RS标准 JAX-RS是Java领域的REST式的Web服务的标准规范,是使用Java完成REST服务的基本约定. 1.3.1 JAX-RS2标准 Java领域中的Web Service是指实现SOAP协议的JAX-WS.直到Java EE 6(发布于2008年9月)通过JCP(Java Community Process)组织定义的JSR311(http://www.jcp.org/en/jsr/detail?id=311),才将REST在Java领域标准化. JSR311

Java RESTful Web Service实战(第2版) 1.4 Jersey项目概要

1.4 Jersey项目概要 Jersey是JAX-RS标准的参考实现,是Java领域中最纯正的REST服务开发框架.本节将带读者走近Jersey的世界. Jersey项目是GlashFish项目的一个子项目,专门用来实现JAX-RS(JSR 311 & JSR 339)标准,并提供了扩展特性. 1.4.1 获得Jersey Jersey项目的地址是https://jersey.java.net.该网站同时提供了JAX-RS和JAX-RS2两个并行版本,分别是JAX-RS1.1(截至本书发稿,最

Java RESTful Web Service实战(第2版) 1.5 快速实现Java REST服务

1.5 快速实现Java REST服务 本节包含两个Jersey实战示例,目的是让读者具备快速创建REST服务的能力. 在开始实战之前,首先需要读者确认你的环境是否已经安装了Java和Maven.这里使用Maven命令,示例如下. mvn -v   Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T19:57:37+08:00) Maven home: /usr/local/Cellar/maven/

Java RESTful Web Service实战(第2版) 1.9 本章小结

1.9 本章小结 本章主要讲述了REST服务的概念和实战.先后解读了REST.REST服务.JAX-RS2标准中的重要概念,对JAX-RS2的参考实现项目Jersey进行了简单而全面的概述.随后讲述了如何快速创建REST应用和REST服务,介绍了基于JAX-RS2标准的其他项目和其他非JAX-RS2标准的.著名的Java项目. 通过阅读本章,读者可以清楚地掌握Java领域开发REST服务中的基本概念. 本章主要的知识点如下. REST是什么 一种架构风格. HTTP+URI+XML是REST的基

Java RESTful Web Service实战(第2版) 1.6 快速了解Java REST服务

1.6 快速了解Java REST服务 1.6.1 REST工程类型 在REST服务中,资源类是接收REST请求并完成响应的核心类,而资源类是由REST服务的"提供者"来调度的.这一概念类似其他框架中自定义的Servlet类,该类会将请求分派给指定的Controller/Action类来处理.本节将讲述REST中的这个提供者,即JAX-RS2中定义的Application以及Servlet. Application类在JAX-RS2(JSR339,详见参考资料)标准中定义为javax.