RESTful Web Services with Java


REST是REpresentational State Transfer的缩写,由Roy Fielding于2000年在其论文 "Architecture Styles and the Design of Network-based Software Architectures" 中首次提出。  

REST是一种架构风格。HTTP是一个协议,它包含了REST架构约束的集合。

REST基础知识

  • REST中的一切都被视为资源。
  • 每个资源都由一个URI来识别。
  • 使用统一的接口。使用POST、GET、PUT、DELETE操作处理资源,这些操作类似于创建、读取、更新和删除(CRUD)操作。
  • 是无状态的。每个请求都是一个独立的请求。从客户端到服务器的每个请求都必须包含理解该请求所需的所有信息。
  • 通过表示法进行通信。如:XML、JSON


RESTful网络服务

RESTful网络服务由于其简单性而被整个网络的大型服务提供商所接受,作为基于SOAP的网络服务的替代。这篇文章将演示如何使用扩展了JAX-RS API的Jersey框架来创建RESTful Web服务和客户端。例子是使用Eclipse IDE和Java SE 6完成的。

创建RESTful Web服务

  • 在Eclipse中,创建一个名为 "RESTfulWS "的新动态Web项目
  • 从   这里下载Jersey zip捆绑包 。这些例子中使用的Jersey版本是1.17.1。一旦你解压,你会有一个名为 "jersey-archive-1.17.1 "的目录。在它里面找到lib目录。从那里复制下面的jars并把它们粘贴到你的项目的WEB-INF -> lib文件夹中。一旦你完成了这些,把这些jars也添加到你的项目构建路径中。
    1. asm-3.1.jar
    2. jersey-client-1.17.1.jar
    3. jersey-core-1.17.1.jar
    4. jersey-server-1.17.1.jar
    5. jsr311-api-1.1.1.jar
  • 在你的项目中,在Java Resources -> src中创建一个名为 "com.eviac.blog.restws "的新包。在里面创建一个新的java类,叫做 "UserInfo"。同时在WEB-INF文件夹中包含给定的web.xml文件。
  • UserInfo.java
    package com.eviac.blog.restws;
    
    
    
    
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.PathParam;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    
    
    
    
    /**
    * 
    * @author pavithra
    * 
    */
    
    
    
    
    // @Path here defines class level path. Identifies the URI path that 
    // a resource class will serve requests for.
    @Path("UserInfoService")
    public class UserInfo {
    
    
    
    
    // @GET here defines, this method will method will process HTTP GET
    // requests.
    @GET
    // @Path here defines method level path. Identifies the URI path that a
    // resource class method will serve requests for.
    @Path("/name/{i}")
    // @Produces here defines the media type(s) that the methods
    // of a resource class can produce.
    @Produces(MediaType.TEXT_XML)
    // @PathParam injects the value of URI parameter that defined in @Path
    // expression, into the method.
    public String userName(@PathParam("i") String i) {
    
    
    
    
    String name = i;
    return "<User>" + "<Name>" + name + "</Name>" + "</User>";
    }
    
    
    
    
    @GET 
    @Path("/age/{j}") 
    @Produces(MediaType.TEXT_XML)
    public String userAge(@PathParam("j") int j) {
    
    
    
    
    int age = j;
    return "<User>" + "<Age>" + age + "</Age>" + "</User>";
    }
    }
    web.xml 要运行这个项目,右击它并点击运行为->在服务器上运行。
  • 在浏览器中执行以下URL,你会看到输出。
  • 输出

创建客户端

  • 创建一个名为 "com.eviac.blog.restclient "的包。在它里面创建一个名为 "UserInfoClient "的java类。

UserInfoClient.java

    package com.eviac.blog.restclient;
    
    
    
    
    import javax.ws.rs.core.MediaType;
    
    
    
    
    import com.sun.jersey.api.client.Client;
    import com.sun.jersey.api.client.ClientResponse;
    import com.sun.jersey.api.client.WebResource;
    import com.sun.jersey.api.client.config.ClientConfig;
    import com.sun.jersey.api.client.config.DefaultClientConfig;
    
    
    
    
    /**
    * 
    * @author pavithra
    * 
    */
    public class UserInfoClient {
    
    
    
    
    public static final String BASE_URI = "http://localhost:8080/RESTfulWS";
    public static final String PATH_NAME = "/UserInfoService/name/";
    public static final String PATH_AGE = "/UserInfoService/age/";
    
    
    
    
    public static void main(String[] args) {
    
    
    
    
    String name = "Pavithra";
    int age = 25;
    
    
    
    
    ClientConfig config = new DefaultClientConfig();
    Client client = Client.create(config);
    WebResource resource = client.resource(BASE_URI);
    
    
    
    
    WebResource nameResource = resource.path("rest").path(PATH_NAME + name);
    System.out.println("Client Response \n"
    + getClientResponse(nameResource));
    System.out.println("Response \n" + getResponse(nameResource) + "\n\n");
    
    
    
    
    WebResource ageResource = resource.path("rest").path(PATH_AGE + age);
    System.out.println("Client Response \n"
    + getClientResponse(ageResource));
    System.out.println("Response \n" + getResponse(ageResource));
    }
    
    
    
    
    /**
    * Returns client response.
    * e.g : 
    * GET http://localhost:8080/RESTfulWS/rest/UserInfoService/name/Pavithra 
    * returned a response status of 200 OK
    *
    * @param service
    * @return
    */
    private static String getClientResponse(WebResource resource) {
    return resource.accept(MediaType.TEXT_XML).get(ClientResponse.class)
    .toString();
    }
    
    
    
    
    /**
    * Returns the response as XML
    * e.g : <User><Name>Pavithra</Name></User> 
    * 
    * @param service
    * @return
    */
    private static String getResponse(WebResource resource) {
    return resource.accept(MediaType.TEXT_XML).get(String.class);
    }
    }

    一旦你运行客户端程序,你会得到以下输出。

    Client Response 
    GET http://localhost:8080/RESTfulWS/rest/UserInfoService/name/Pavithra returned a response status of 200 OK
    Response 
    <User><Name>Pavithra</Name></User>
    
    
    
    
    
    
    
    
    Client Response 
    GET http://localhost:8080/RESTfulWS/rest/UserInfoService/age/25 returned a response status of 200 OK
    Response 
    <User><Age>25</Age></User>

    享受吧!