基於Jsersy的RSET服務的實現

本文主要介紹如何用Jsersy實現RESTful服務。在介紹Jsersy以前,先介紹一下Rest和Restful的概念。 html

什麼是REST

REST 中最重要的概念是資源(resources),使用全球 ID(一般使用 URI)標識。客戶端應用程序使用 HTTP 方法(GET/ POST/ PUT/ DELETE)操做資源或資源集。RESTful Web 服務是使用 HTTP 和 REST 原理實現的 Web 服務。一般,RESTful Web 服務應該定義如下方面: java

  • Web 服務的基/根 URI,好比 http://host/<appcontext>/resources。  
  • 支持 MIME 類型的響應數據,包括 JSON/XML/ATOM 等等。  
  • 服務支持的操做集合(例如 POST、GET、PUT 或 DELETE)。

首先你們要明確,REST不是一種技術標準,REST是一種架構風格,而RESTful是基於REST原理實現的一種Web服務。 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等等。 apache

最新版Jsersy有如下幾部分構成: json

  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 api

建立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/168667tomcat

配置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。 app

@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。

image

在URL框中輸入訪問資源URL,分別點擊GET,POST,PUT,DELETE按鈕會調用不一樣的資源服務。

固然若是對Linux 的Curl命令熟悉,也能夠用該命令進行測試。

注意:本實驗運行環境:tomcat 7.0。

相關文章
相關標籤/搜索