REST基础概念:

  • 在REST中的一切都被认为是一种资源。
  • 每个资源由URI标识。
  • 使用统一的接口。处理资源使用POST,GET,PUT,DELETE操作类似创建,读取,更新和删除(CRUD)操作。
  • 无状态。每个请求是一个独立的请求。从客户端到服务器的每个请求都必须包含所有必要的信息,以便于理解。
  • 通信都是通过展现。例如XML,JSON

RESTful Web服务由于其简单替代了基于SOAP的Web服务,并大型服务提供商所接受。这篇文章使用Jersey框架延伸JAX-RS API将展示如何创建一个REST风格的Web服务和客户端。

在Eclipse中,创建一个新的动态Web项目名为"RESTfulWS":

下载Jersey zip bundle 这里 here. 需要包:

  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

加入项目:

创建Web服务类:

package com.snow.jersey;

import javax.ws.rs.GET;
import javax.ws.rs.POST;
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>";
} @POST
@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

<?xml version="1.0" encoding="UTF-8"?>
<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">
<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.snow.jersey</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>

点按这个项目 run as ->run on server.

浏览器浏览:http://localhost:8080/RESTfulWS/rest/UserInfoService/name/Pavithra

URL说明:

 创建一个调用客户端:

package com.snow.jersey;

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/jersey";
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);
} }
public  void testHelloService() throws URISyntaxException {
Client client = Client.create();
URI u = new URI("http://houfeng:8080/jerseyWebServiceTest/services/hello");
System.out.println(u);
WebResource resource = client.resource(u);
//get
String result = resource.get(String.class);
System.out.println(result); //get param
u = new URI("http://houfeng:8080/jerseyWebServiceTest/services/hello/sex");
System.out.println(u);
resource = client.resource(u);
MultivaluedMapImpl params = new MultivaluedMapImpl();
params.add("name", "houfeng");
result = resource.queryParams(params).get(String.class);
System.out.println(result); u =new URI("http://houfeng:8080/jerseyWebServiceTest/services/hello/test_get");
System.out.println(u);
resource = client.resource(u);
params = new MultivaluedMapImpl();
params.add("name", "houfeng");
result = resource.queryParams(params).get(String.class);
System.out.println(result); u =new URI("http://houfeng:8080/jerseyWebServiceTest/services/hello/test_get2");
System.out.println(u);
resource = client.resource(u);
params = new MultivaluedMapImpl();
params.add("name", "houfeng");
result = resource.queryParams(params).get(String.class);
System.out.println(result); u =new URI("http://houfeng:8080/jerseyWebServiceTest/services/hello/test_post1");
System.out.println(u);
resource = client.resource(u);
params = new MultivaluedMapImpl();
params.add("name", "houfeng");
result = resource.type(MediaType.APPLICATION_FORM_URLENCODED).post(String.class,params);
System.out.println(result);

  //post
u =new URI("http://houfeng:8080/jerseyWebServiceTest/services/hello/test_post2");
System.out.println(u);
resource = client.resource(u);
params = new MultivaluedMapImpl();
params.add("name", "houfeng");
result = resource.queryParams(params).type(MediaType.APPLICATION_FORM_URLENCODED).post(String.class);
System.out.println(result); u =new URI("http://houfeng:8080/jerseyWebServiceTest/services/hello/test_post3");
System.out.println(u);
resource = client.resource(u);
result = resource.entity("hello").post(String.class);
System.out.println(result); u =new URI("http://houfeng:8080/jerseyWebServiceTest/services/hello/test_post4");
System.out.println(u);
resource = client.resource(u);
String buf = "inputstream content.";
ByteArrayInputStream bais = new ByteArrayInputStream(buf.getBytes());
result = resource.entity(bais).post(String.class);
System.out.println(result);
}

运行这个客户端代码,得到结果:

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>

Jersey的RESTful简单案例demo的更多相关文章

  1. 将jetty嵌入到应用中的简单案例

    前面说过jetty最广泛的应用是可以方便的嵌入到应用程序中,而不是作为应用服务器,下面就用最简单的demo来演示一个最简单的应用 1.下载并导入依赖 首先应该建立一个普通的java项目,然后把依赖包导 ...

  2. Struts2学习笔记NO.1------结合Hibernate完成查询商品类别简单案例(工具IDEA)

    Struts2学习笔记一结合Hibernate完成查询商品类别简单案例(工具IDEA) 1.jar包准备 Hibernate+Struts2 jar包 struts的jar比较多,可以从Struts官 ...

  3. Spring Kafka和Spring Boot整合实现消息发送与消费简单案例

    本文主要分享下Spring Boot和Spring Kafka如何配置整合,实现发送和接收来自Spring Kafka的消息. 先前我已经分享了Kafka的基本介绍与集群环境搭建方法.关于Kafka的 ...

  4. SSM框架整合(Spring+SrpingMVC+Mybatis) 简单案例

    简介: SSM框架是Spring,SpringMVC 和Mybatis框架的整合,是标准的MVC模式,将整个系统划分为表现层,controller层,service层,dao层四层. Spring实现 ...

  5. SpringDataRedis操作Redis简单案例

    Jedis Jedis是Redis官方推出的一款面向Java的客户端,提供了很多接口供Java语言调用.可以在Redis官网下载,当然还有一些开源爱好者提供的客户端,如Jredis.SRP等等,推荐使 ...

  6. 分享知识-快乐自己:Shrio 案例Demo概述

    Shiro 权限认证核心: POM:文件: <!--shiro-all--> <dependency> <groupId>org.apache.shiro</ ...

  7. Eclipse + Jersey 发布RESTful WebService(一)了解Maven和Jersey,创建一个WS项目(成功!)

    一.下文中需要的资源地址汇总 Maven Apache Maven网站 http://maven.apache.org/ Maven下载地址: http://maven.apache.org/down ...

  8. SpringBoot基础学习(一) SpringBoot概念、简单案例实现、单元测试及热部署讲解

    SpringBoot概念 Spring优缺点分析 Spring优点 Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品,无需开发重量级的 ...

  9. C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo

    在文章开始之前,首先简单介绍一下什么是MEF,MEF,全称Managed Extensibility Framework(托管可扩展框架).单从名字我们不难发现:MEF是专门致力于解决扩展性问题的框架 ...

随机推荐

  1. hdu1114

    完全背包的水题,不过今天才学动态规划,就这样啦……hahahah!!! 完全背包跟普通背包的区别是普通背包从后往前循环,以防止被替换 完全背包是从前往后循环,后面的状态会跟着之前状态的改变而改变…… ...

  2. boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET

    boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET     boost::crc_32_type crc32;       crc32. ...

  3. Perl入门(四)Perl的正則表達式

    正則表達式是Perl语言的特色.主要的语法不是非常难,可是编写一个符合需求.高效的正則表達式.还是有一些挑战的. Perl的三种匹配模式 1.查找 语法:m/正則表達式内容/; 作用:查找匹配内容中是 ...

  4. MVC3和MVC4中CRUD操作

    MVC3中EF实现的CRUD操作 public class HomeController : Controller { // // GET: /Home/ CarModelContainer db = ...

  5. XMPPclient库Smack 4.0.6一个版本的开发

    XMPPclient库Smack 4.0.6版开发之中的一个 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.Smack库概述 Smack是一个开源. ...

  6. flexbox语法(摘抄)

    flex 容器上的属性: flex-direction: row | row-reverse | column | column-reverse (项目的排列方向) flex-wrap : nowra ...

  7. android studio 9.png 报错

    Eclipse里能正常运行,但是导入到Android Studio里就报如下的错误 百度了下,说有两种解决办法一种是改后缀名,还有一种是重新在Android Studio里画一下点9图片.但是这个项目 ...

  8. Lisp的永恒之道 好文

    http://www.cnblogs.com/weidagang2046/archive/2012/06/03/tao_of_lisp.html

  9. maven使用.02.一些概念

    在上一篇POST中,简要的介绍了一下maven的特点,优势,安装.并建立了一个简单地Hello world工程.这一篇POST中,将主要会介绍一下Maven的一些约定. pom.xml文件 Maven ...

  10. 深入 理解 Statement 和 PreparedStatement

    一.使用Statement而不是PreparedStatement对象 JDBC驱动的最佳化是基于使用的是什么功能. 选择PreparedStatement还是Statement取决于你要怎么使用它们 ...