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 8编写。

一、新建项目:RESTfulWS ,然后创建RESTful Web Service服务端

  • 在Eclipse中创建一个“dynamic web project”(动态web工程) ,项目名设为 “RESTfulWS”。
  • 从这里下载Jersey(https://jersey.github.io/)。示例代码使用的是Jersey 1.19.1。首先解压Jersey到“jersey-archive-1.19.1”文件夹。接着将里面lib文件夹下的jar文件拷贝到工程目录的WEB-INF -> lib。然后将它们添加到build path。
    1. asm-3.1.jar
    2. jersey-client-1.19.1.jar
    3. jersey-core-1.19.1.jar
    4. jersey-server-1.19.1.jar
    5. jersey-servlet-1.19.1.jar
    6. jsr311-api-1.1.1.jar
    7. jersey-bundle-1.19.1.jar(单独下载 http://mvnrepository.com/artifact/com.sun.jersey/jersey-bundle)

在工程Java Resources -> src中创建“com.eviac.blog.restws”包,并在其中创建“UserInfo”类。

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 * */// 这里@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>";}@GET@Path("/department/{k}")@Produces(MediaType.TEXT_XML)public String userDepartment(@PathParam("k")String k) {String userDepartment = k;return "<User>" + "<Department>" + userDepartment + "</Department>" + "</User>";}
}

最后把web.xml拷贝到WEB-INF目录下,web.xml内容为:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.5"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><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>

  • 将此webservice-URL拷贝到浏览器地址栏中运行:http://localhost:8080/RESTfulWS/rest/UserInfoService/name/lxj

二、再新建一个项目:RestTest,来创建客户端,使用上一个项目发布的webservice服务接口

  • 首先创建一个独立新项目:RestTest (再次创建一个java project即可)。
  • 这里同样需要Jersey框架的lib目录下的jar包。解压Jersey到“jersey-archive-1.19.1”文件夹,接着将里面lib文件夹下的jar文件拷贝到工程目录的WEB-INF -> lib或者将它们添加到build path。

asm-3.1.jar

jersey-client-1.19.1.jar

jersey-core-1.19.1.jar

jersey-server-1.19.1.jar

jersey-servlet-1.19.1.jar

jsr311-api-1.1.1.jar

jersey-bundle-1.19.1.jar(单独下载 http://mvnrepository.com/artifact/com.sun.jersey/jersey-bundle)

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

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 final String PATH_DEP = "/UserInfoService/department/";/*** 返回客户端请求。 例如: 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);}public static void main(String[] args) {String name = "雷小江";int age = 27;String department="中国***公司";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));WebResource departmentResource = resource.path("rest").path(PATH_DEP + department);System.out.println("Client Response \n"+ getClientResponse(departmentResource));System.out.println("Response \n" + getResponse(departmentResource));}}

  • 运行客户端程序后,可以看到以下输出:

转载于:https://www.cnblogs.com/Lxiaojiang/p/8990456.html

WebService之基于REST机制的实现实例(Java版)相关推荐

  1. 中宣部防沉迷实名认证系统对接实例-JAVA版

    代码转自沟通群里,群号:960656498 ,有需求可以进去沟通一下 ,亲测都能用 ,线上使用时需要修改httpclient, 改成httpClient连接池 import static java.n ...

  2. fusioncharts java_FusionCharts 导出图片实例 java版 | 学步园

    因为项目需要,需要使用FusionCharts进行导出. 下面就是自己写得例子. 这个是就是FusionCharts的Readme.txt中提示的导出步骤 FusionCharts服务器端输出处理程序 ...

  3. java jfm入门_image Java版*图像过滤入门示例及源码模拟绿坝过滤机制 - 下载 - 搜珍网...

    Java版*图像过滤入门示例及源码-0.1.0 (模拟绿坝过滤机制)/image/dy.jpg Java版*图像过滤入门示例及源码-0.1.0 (模拟绿坝过滤机制)/image/dymh.jpg Ja ...

  4. 【刘文彬】以太坊RPC机制与API实例

    原文链接:醒者呆的博客园,https://www.cnblogs.com/Evsward/p/eth-rpc.html 上一篇文章([刘文彬]探路以太坊)介绍了以太坊的基础知识,我们了解了web3.j ...

  5. 平安保险基于 SPI 机制的 RocketMQ 定制化应用

    作者:孙园园|平安人寿资深开发 为什么选用 RocketMQ 首先跟大家聊聊我们为什么会选用 RocketMQ,在做技术选型的过程中,应用场景应该是最先考虑清楚的,只有确定好了应用场景在做技术选型的过 ...

  6. 详解Linux2.6内核中基于platform机制的驱动模型

    原文地址:详解Linux2.6内核中基于platform机制的驱动模型 作者:nacichan [摘要]本文以Linux 2.6.25 内核为例,分析了基于platform总线的驱动模型.首先介绍了P ...

  7. 依赖注入底层反射原理_PHP基于反射机制实现自动依赖注入的方法详解_php技巧...

    这篇文章主要介绍了PHP基于反射机制实现自动依赖注入的方法,结合实例形式分析了php使用反射实现自动依赖注入的步骤.原理与相关操作技巧,本文实例讲述了PHP基于反射机制实现自动依赖注入的方法.分享给大 ...

  8. Hystrix面试 - 基于 timeout 机制为服务接口调用超时提供安全保护

    Hystrix面试 - 基于 timeout 机制为服务接口调用超时提供安全保护 一般来说,在调用依赖服务的接口的时候,比较常见的一个问题就是超时.超时是在一个复杂的分布式系统中,导致系统不稳定,或者 ...

  9. 用python写helloworld_Python基于Tkinter的HelloWorld入门实例

    Python基于Tkinter的HelloWorld入门实例 本文实例讲述了Python基于Tkinter的HelloWorld入门实例.分享给大家供大家参考.具体分析如下: 初学Python,打算做 ...

  10. NLP-Beginner任务三学习笔记:基于注意力机制的文本匹配

    **输入两个句子判断,判断它们之间的关系.参考ESIM(可以只用LSTM,忽略Tree-LSTM),用双向的注意力机制实现** 数据集:The Stanford Natural Language Pr ...

最新文章

  1. linux进程和程序的却别,操作系统:进程的概念和与程序的区别
  2. 单防区扩展模块怎么用_Zens推出模块化可扩展无线充电器 可为6台设备同时供电...
  3. JS子元素oumouseover触发父元素onmouseout
  4. Cygwin下安装Android NDK
  5. DataAdapter.FillSchema 方法
  6. 企业微信H5_网页jssdk调用 config和agentconfig的区别
  7. list steam_在 Steam 中国版上玩单机游戏也会受到防沉迷系统管控
  8. JavaScript中有关数据结构和算法的最佳书籍
  9. kingbase7获取唯一索引和子分区键的view
  10. 【慢慢学Android】:11.对话框大全
  11. Golang slice高级应用
  12. WebDriver使用入门
  13. matlab 创建批量文件夹_学会这12个批量操作,从此告别加班!
  14. 路由算法之距离矢量算法和链路状态算法
  15. [转]如何配置sql server2005允许远程连接
  16. 四、hibernate实体对象,事务管理,锁
  17. 预处理criteo数据集以预测广告的点击率
  18. iOS中HTTPS证书验证浅析
  19. python绘制闭合多边形_python – 从边界点创建闭合多边形
  20. bzoj4199 [Noi2015]品酒大会

热门文章

  1. android 属性翻牌动画,如何在Android中利用TextSwitcher实现一个文字上下翻牌效果
  2. vue之生命周期(beforeCreate,created,beforeMount,mounted,beforeUpdate,updated)
  3. Web项目常用技术整理
  4. 阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_08.RequestMapping注解的作用
  5. ARP (地址解析协议)
  6. 汇编实验 三 编程、编译、连接、跟踪
  7. BFS Codeforces Beta Round #94 (Div. 2 Only) C. Statues
  8. 转 json数组对象和对象数组
  9. JAVA练习题1(初级基本数据类型、运算符)
  10. 九、注解、有助于更好的理解框架