zoukankan      html  css  js  c++  java
  • 使用Java创建RESTful Web Service(转)

    REST是REpresentational State Transfer的缩写(一般中文翻译为表述性状态转移)。2000年Roy Fielding博士在他的博士论文“Architectural Styles and the Design of Network-based Software Architectures”《体系结构与基于网络的软件架构设计》中提出了REST。

    REST是一种体系结构。而HTTP是一种包含了REST架构属性的协议。

    REST基础概念

    • 在REST中所有东西都被看作资源。每一个资源都有一个URI和它对应。
    • 在REST中使用统一接口处理资源。与数据库CRUD操作(Create、Read、Update 和 Delete)一样,可以用POST、GET、PUT和DELETE处理REST资源。
    • 每个REST请求都是孤立的,请求中包含了所需的全部信息。REST服务端不存储状态。
    • REST支持不同的通信数据格式,比如XML、JSON。

    RESTful Web Services

    RESTful Web Services因其简单性被广泛使用,它比SOAP要更简单。本文将重点介绍如何使用Jersey框架创建RESTful Web Services。Jersey框架实现了JAX-RS接口。本文示例代码使用Eclipse和Java SE 6编写。

    创建RESTful Web Service服务端

    • 在Eclipse中创建一个“dynamic web project”(动态web工程) ,项目名设为 “RESTfulWS”。

     

    • 这里下载Jersey。示例代码使用的是Jersey 1.17.1。首先解压Jersey到“jersey-archive-1.17.1”文件夹。接着将里面lib文件夹下的jar文件拷贝到工程目录的WEB-INF -> lib。然后将它们添加到build path。
    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. jersey-servlet-1.17.1.jar
    6. jsr311-api-1.1.1.jar
    • 在工程Java Resources -> src中创建“com.eviac.blog.restws”包,并在其中创建“UserInfo”类。最后把web.xml拷贝到WEB-INF目录下。

    UserInfo.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    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定义了类的层次路径。
    // 指定了资源类提供服务的URI路径。
    @Path("UserInfoService")
    public class UserInfo {
     
    // @GET表示方法会处理HTTP GET请求
    @GET
    // 这里@Path定义了类的层次路径。指定了资源类提供服务的URI路径。
    @Path("/name/{i}")
    // @Produces定义了资源类方法会生成的媒体类型。
    @Produces(MediaType.TEXT_XML)
    // @PathParam向@Path定义的表达式注入URI参数值。
    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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee <a href="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"</a> id="WebApp_ID" version="2.5">
    <display-name>RESTfulWS</display-name>
    <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
    <param-name>com.sun.jersey.config.property.packages</param-name>
    <param-value>com.eviac.blog.restws</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
    </web-app>
    • 将此URL拷贝到浏览器地址栏中运行:
    1. http://localhost:8080/RESTfulWS/rest/UserInfoService/name/Pavithra

    输出结果如下:

    创建客户端

    创建一个“com.eviac.blog.restclient”包,然后新建“UserInfoClient”类。

    UserInfoClient.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    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 "
    + getClientResponse(nameResource));
    System.out.println("Response " + getResponse(nameResource) + " ");
     
    WebResource ageResource = resource.path("rest").path(PATH_AGE + age);
    System.out.println("Client Response "
    + getClientResponse(ageResource));
    System.out.println("Response " + getResponse(ageResource));
    }
     
    /**
    * 返回客户端请求。
    * 例如:
    * GET http://localhost:8080/RESTfulWS/rest/UserInfoService/name/Pavithra
    * 返回请求结果状态“200 OK”。
    *
    * @param service
    * @return
    */
    private static String getClientResponse(WebResource resource) {
    return resource.accept(MediaType.TEXT_XML).get(ClientResponse.class)
    .toString();
    }
     
    /**
    * 返回请求结果XML
    * 例如:<User><Name>Pavithra</Name></User>
    *
    * @param service
    * @return
    */
    private static String getResponse(WebResource resource) {
    return resource.accept(MediaType.TEXT_XML).get(String.class);
    }
    }
    • 运行客户端程序后,可以看到以下输出:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    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>

    试试吧 :)

    http://www.importnew.com/7336.html

  • 相关阅读:
    二分+RMQ/双端队列/尺取法 HDOJ 5289 Assignment
    思维题 HDOJ 5288 OO’s Sequence
    树形DP Codeforces Round #135 (Div. 2) D. Choosing Capital for Treeland
    最大流增广路(KM算法) HDOJ 1853 Cyclic Tour
    最大流增广路(KM算法) HDOJ 1533 Going Home
    最大流增广路(KM算法) HDOJ 2255 奔小康赚大钱
    Complete the Word CodeForces
    Gadgets for dollars and pounds CodeForces
    Vasya and Basketball CodeForces
    Carries SCU
  • 原文地址:https://www.cnblogs.com/softidea/p/5585582.html
Copyright © 2011-2022 走看看