【webservice】Restfuljavaapi入门小结(基于jersey实现)   返回主页

参考资料https://www.gitbook.com/book/waylau/rest-in-action/details

之前通过servlet的方式进行了一个service的编写。最近在家《RESTful web APIs》这本书,对于“表述性状态移交”和“超媒体”有了些许认识,解决了些许对于webservice的困惑。

于是想要实际操作一下,查找相关资料之后得知Oracle官方有名为Jersey的RESTful参考实现,本文即是讲解基于jersey进行RESTful webservice的简单构建。

PS:本文用到Maven构建工具进行工程的构建和打包,虽然本文不对Maven进行过多描述,但感兴趣的读者可以参考《maven实战》一书进行了解。

工程演示

在命令行界面输入“mvn install package”进行打包

restful_1/package.png

打包成功显示BUILD SUCCESS,在项目的target目录下找到war包,即是打包之后的结果,将该war包部署到tomcat或jetty等servlet容器,并运行(这个不用解释了,web开发必备),输入http://localhost:8080/handle-json-xml/显示如下效果

restful_1/main.png

点击Got it链接显示如下

restful_1/main.png

点击POJO JSON链接显示如下

restful_1/main.png

点击POJO XML链接显示如下

restful_1/main.png

可以看到,不同的URL显示出我们想要的数据格式

 pom.xml(用于maven构建的重要文件,详细描述了项目的依赖关系)

<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>com.snowalker</groupId>
<artifactId>handle-json-xml</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>handle-json-xml</name>

<build>
    <finalName>handle-json-xml</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.5.1</version>
            <inherited>true</inherited>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
</build>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.glassfish.jersey</groupId>
            <artifactId>jersey-bom</artifactId>
            <version>${jersey.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-moxy</artifactId>
    </dependency>
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>3.8.1</version>
  <scope>test</scope>
</dependency>

</dependencies>
<properties>
    <jersey.version>2.16</jersey.version>
    <tomcat7.version>2.2</tomcat7.version>
    <jetty.version>9.2.9.v20150224</jetty.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

可以看到我们使用了jersey依赖包,junit测试框架

代码及分析

MyBean.java定义了一个POJO类,使用@XmlRootElement声明xml文档树根

package com.snowalker.rest.bean;

import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class MyBean {

private String name;
private int age;

public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getAge() {
    return age;
}
public void setAge(int age) {
    this.age = age;
}

}

MyResource.java,声明url结构以及使用@GET注解进行get方法声明, @Path("pojoxml")@Produces(MediaType.APPLICATIONXML)注解表明输出的结果为xml超媒体类型, @Path("pojojson")@Produces(MediaType.APPLICATIONJSON)注释表明输出类型为json文档

    package com.snowalker.rest.resource;

    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;

    import com.snowalker.rest.bean.MyBean;

    /**
     * 根资源 (暴露在"myresource"路径)
     */
    @Path("myresource")
    public class MyResource {

    /**
     * 方法处理 HTTP GET 请求。返回的对象以"text/plain"媒体类型
     * 给客户端
     *
     * @return String 以 text/plain 形式响应
     */
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getIt() {
        return "Got it!";
    }


    /**
     * 方法处理 HTTP GET 请求。返回的对象以"application/xml"媒体类型
     * 给客户端
     *
     * @return MyPojo 以 application/xml 形式响应
     */
    @GET
    @Path("pojoxml")
    @Produces(MediaType.APPLICATION_XML)
    public MyBean getPojoXml() {
        MyBean pojo = new MyBean();
        pojo.setName("snowalker.com");
        pojo.setAge(28);
        return pojo;
    }

    /**
     * 方法处理 HTTP GET 请求。返回的对象以"application/json"媒体类型
     * 给客户端
     *
     * @return MyPojo 以 application/json 形式响应
     */
    @GET
    @Path("pojojson")
    @Produces(MediaType.APPLICATION_JSON)
    public MyBean getPojoJson() {
        MyBean pojo = new MyBean();
        pojo.setName("snowalker.com");
        pojo.setAge(28);
        return pojo;
    }

}

RestApplication.java是REST主应用类,声明了资源类所在的包路径,继承了ResourceConfig

package com.snowalker.rest;

import org.glassfish.jersey.server.ResourceConfig;

/**
 * REST 主应用
 */
public class RestApplication extends ResourceConfig {

    public RestApplication() {
        //资源类所在的包路径  
        packages("com.snowalker.rest.resource"); 
    }
}

web.xml进行org.glassfish.jersey.servlet.ServletContainer配置及url映射

<?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 -->
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
 <servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
  <param-name>javax.ws.rs.Application</param-name>
  <param-value>com.snowalker.rest.RestApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/webapi/*</url-pattern>
 </servlet-mapping>
</web-app>

index.jsp用于对该service进行验证,定义三个"a"标签,分别对应三个不同的url

  1. webapi/myresource 显示字符串
  2. webapi/myresource/pojojson 用json格式显示定义的bean信息
  3. webapi/myresource/pojoxml 用xml格式显示定义的bean信息

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    
    <html>
    <head>
    
        <meta charset="utf-8">
    </head>
    
    <body>
        <h2>Java RESTful webservice Jersey 实现</h2>
        <p><a href="webapi/myresource">Got it</a>
        <p><a href="webapi/myresource/pojojson">POJO JSON</a>
        <p><a href="webapi/myresource/pojoxml">POJO XML</a>
    </body>
    </html>
    

小结:

Jersey作为官方给出的参考实现是比较完整的,解决了困扰我多日的web服务输出json格式数据的问题,归根到底,json也好xml也好都只是一种表述,这正体现了RESTful核心概念“资源”“表述”。