利用Jsersy实现RSET服务
本文主要介绍如何用Jsersy实现RESTful服务。在介绍Jsersy之前,先介绍一下Rest和Restful的概念。
什么是REST
REST 中最重要的概念是资源(resources),使用全球 ID(通常使用 URI)标识。客户端应用程序使用 HTTP 方法(GET/ POST/ PUT/ DELETE)操作资源或资源集。RESTful Web 服务是使用 HTTP 和 REST 原理实现的 Web 服务。通常,RESTful Web 服务应该定义以下方面:
- Web 服务的基/根 URI,比如 http://host/<appcontext>/resources。
- 支持 MIME 类型的响应数据,包括 JSON/XML/ATOM 等等。
- 服务支持的操作集合(例如 POST、GET、PUT 或 DELETE)。
首先大家要明确,REST不是一种技术标准,REST是一种架构风格,而RESTful是基于REST原理实现的一种Web服务。
什么是Jsersy
Jsersy是Java的REST架构风格实现RESTful Web服务开源框架,在Java世界里,一般都有一个标准,关于REST规范叫JAX-RS(即: JSR-311),该标准于2007提出,在JAX-RS标准提出之前,JAVA有restlet和resteasy之类的框架,随着REST架构设计风 格广泛流行,支持REST风格的RESTful服务框架越来越多,如Spring MVC,Axis2等等。
最新版Jsersy有以下几部分构成:
- Jersey Core
- Jersey Containers
- Jersey Connectors
- Jersey Media
- Jersey Extensions
每个模块下又分给很小模块,在这就不一一介绍,大家可以参考Jsersy帮助文 档:https://jersey.java.net/documentation/latest/modules-and-dependencies.html#modules
创建RESTful项目
在Eclipse中,创建一个新项目,采用Maven管理项目,pom.xml配置如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.opensv</groupId><artifactId>rest-example</artifactId><packaging>war</packaging><version>0.0.1-SNAPSHOT</version><name>rest-example Jersey Webapp</name><build><finalName>rest-example</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><inherited>true</inherited><configuration><source>1.6</source><target>1.6</target></configuration></plugin><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>9090</port><path>/rest</path><uriEncoding>UTF-8</uriEncoding><finalName>rest</finalName><server>tomcat7</server></configuration></plugin></plugins></build><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.8.2</version><scope>test</scope></dependency><dependency><groupId>org.glassfish.jersey.core</groupId><artifactId>jersey-client</artifactId><version>2.0-m13</version></dependency><dependency><groupId>org.glassfish.jersey.core</groupId><artifactId>jersey-common</artifactId><version>2.0-m13</version></dependency><dependency><groupId>org.glassfish.jersey.core</groupId><artifactId>jersey-server</artifactId><version>2.0-m13</version></dependency><dependency><groupId>org.glassfish.jersey.containers</groupId><artifactId>jersey-container-servlet</artifactId><version>2.0-m13</version></dependency><dependency><groupId>org.glassfish.jersey.media</groupId><artifactId>jersey-media-json-jackson</artifactId><version>2.0-m13</version></dependency><dependency><groupId>org.glassfish.jersey.media</groupId><artifactId>jersey-media-sse</artifactId><version>2.0-m13</version></dependency><dependency><groupId>org.glassfish.jersey.media</groupId><artifactId>jersey-media-multipart</artifactId><version>2.0-m13</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.2</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.2</version></dependency></dependencies><properties><jersey-version>1.17.1</jersey-version></properties><repositories><repository><id>glassfish.java.net</id><name>GlassFish Maven Repository</name><url>http://download.java.net/maven/glassfish</url><layout>default</layout></repository><repository><id>m2.java.net</id><name>Java.net Maven 2 Repository</name><url>http://download.java.net/maven/2</url><layout>default</layout></repository></repositories><pluginRepositories><pluginRepository><id>m2.java.net</id><name>Java.net Maven 2 Repository</name><url>http://download.java.net/maven/2</url><layout>default</layout></pluginRepository></pluginRepositories></project>
在本例中,使用tomcat 作为运行容器,因此,需要在pom.xml添加Tomcat插件。具体Tomcat插件如何使用,见我另一篇博文,http://my.oschina.net/lilw/blog/168667。
配置Web.xml
<?xml version="1.0" encoding="UTF-8"?><!-- This web.xml file is not required when using Servlet 3.0 container,
see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html#d4e194 --><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><!--配置Jsersy Servlet-->
<servlet><servlet-name>jersey</servlet-name><!--注意:如果Servlet是2.0-->
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class><!--配置应用类-->
<init-param><param-name>javax.ws.rs.Application</param-name><param-value>cn.opensv.rest.api.ExampleApplication</param-value></init-param><load-on-startup>1</load-on-startup></servlet><!--配置Servlet映射-->
<servlet-mapping><servlet-name>jersey</servlet-name><url-pattern>/*</url-pattern></servlet-mapping></web-app>
本文先用最单的配置方式,具体更高级应用,在后续文章中会陆续介绍。
创建资源类
package cn.opensv.rest.api;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
//资源类
@Path("api/example01")
public class Example01 {@GET@Produces("text/plain")
public String get() {
return "I am get Method!";}@PUT@Produces("text/plain")
public String put() {
return "I am put Method!";}@POST@Produces("text/plain")
public String post() {
return "I am post Method!";}@DELETE@Produces("text/plain")
public String delete() {
return "I am delete Method!";}}
@Path 调用资源服务的路径,即REST的URI。
@GET http 的GET请求 GET请求是获取/列出/检索单个资源或资源集合。
@PUT http 的PUT请求 PUT请求是更新现有资源或资源集合。
@POST http的POST请求 POST请求是新建资源。
@DELETE http的DELETE请求 DELETE请求是删除资源或资源集合。
@Produces 是每次请求返回的HTTP内容的类型。
这样基本搞掂一个简单的RESTful服务。
创建应用类
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
/**
* 创建应用类
* @author liliangwen
*
*/
@ApplicationPath("/")
public class ExampleApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
final Set<Class<?>> classes = new HashSet<Class<?>>();
//注册资源类
classes.add(Example01.class);
return classes;
}
}
在应用类中注册资源类,并把应用类配置到Web.xml中。
客户端测试
本文先简单介绍一个测试工具,可以借助Chrome浏览器的插件进行的REST服务测试。插件名称:Chrome Poster。
在URL框中输入访问资源URL,分别点击GET,POST,PUT,DELETE按钮会调用不同的资源服务。
当然如果对Linux 的Curl命令熟悉,也可以用该命令进行测试。
注意:本实验运行环境:tomcat 7.0。