利用Jsersy实现RSET服务

jopen 10年前

本文主要介绍如何用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有以下几部分构成:

  1. Jersey Core
  2. Jersey Containers
  3. Jersey Connectors
  4. Jersey Media
  5. 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。

利用Jsersy实现RSET服务

在URL框中输入访问资源URL,分别点击GET,POST,PUT,DELETE按钮会调用不同的资源服务。

当然如果对Linux 的Curl命令熟悉,也可以用该命令进行测试。

注意:本实验运行环境:tomcat 7.0。