Java Restful Web Services (一)

REST(Representational State Transfer,表述性状态转移),是Roy Thomas Fielding在他2000年的博士论文《Architectural Styles and the Design of Network-based Software Architectures》提出,与复杂的SOAPXML-RPC相比,REST更加简洁,越来越多的Web服务开始采用REST风格设计和实现。Rest是一种架构风格,在这样的架构风格中,对象被抽象成为一种资源,资源的命名使用概念清晰的名词来定义,HTTP+URI+XML是Rest的基本实现形式。JAX-RS是JAVA EE6 引入的一个新技术,是Java领域的Rest式的Web服务的标准规范,JAX-RS即Java API for RESTful Web Services,是一个Java 编程语言的应用程序接口,支持按照表述性状态转移(REST)架构风格创建Web服务。JAX-RS使用了Java SE5引入的Java标注来简化Web服务的客户端和服务端的开发和部署。Jersey是JAX-RS标准的参考实现。

基于Jersey开发Restful服务,新建一个Web工程,引入我们需要的jar包,Jersey最新参考实现Jar包可通过Jersey官方网站下载

新建一个package,定义资源类。

package cn.com.abc.rest;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;

@Path("helloworld")
public class HelloWorldResource {
	public static final String CLICHED_MESSAGE = "Hello World!";

	
	@GET
	@Path("/before")
	@Produces("text/plain")
	public String getHelloBefore() {
		return "hello before";
	}
	
	
	@GET
	@Produces("text/plain")
	public String getHello() {
		return CLICHED_MESSAGE;
	}
	
	@GET
	@Path("/{param}")
	@Produces("text/plain") 
	public String getHello(@PathParam("param")  String username) {
		return "Hello Path Param " + username;
	}
	
	
	@GET
	@Path("/user")
	@Produces("text/plain")
	public String getHelloWithQuery(@QueryParam("param") String username) {
		return "Hello Query Param " + username;
	}
	

	
}





修改web.xml


    Way REST Service
    org.glassfish.jersey.servlet.ServletContainer
    
      jersey.config.server.provider.packages      
      cn.com.abc.rest;com.fasterxml.jackson.jaxrs.json
        
    1
  
  
    Way REST Service
    /rest/*
  

如果您的资源实现类放在不同的包中,那么您可在属性param-value中指定多个包名用以对外公布REST服务接口。 接下来是我们的测试类。

package cn.com.abc.test;

import static org.junit.Assert.*;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class HelloWorldResourceTest {

	private WebTarget target;
	public static final String BASE_URI = "http://localhost:8090/NoteMail/rest/";

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		System.out.println("setUpBeforeClass");
	}

	@AfterClass
	public static void tearDownAfterClass() throws Exception {
		System.out.println("tearDownAfterClass");
	}

	@Before
	public void setUp() throws Exception {
		System.out.println("setUp");
		Client c = ClientBuilder.newClient();
		target = c.target(BASE_URI);
		System.out.println(target.getUri());
	}

	@After
	public void tearDown() throws Exception {
		System.out.println("tearDown");
	}

	
	
	@Test
	public void testGetHello() {

		String responseMsg = target.path("helloworld").request()
				.get(String.class);		
		assertEquals("Hello World!", responseMsg);
		
	}
	
	@Test
	public void testGetHelloWithPathParam() {

		String responseMsg = target.path("helloworld/ABC").request().get(String.class);		
		assertEquals("Hello Path Param ABC", responseMsg);
		
	}
	
	
	@Test
	public void testGetHelloWithQueryParam() {

		String responseMsg = target.path("helloworld/user").queryParam("param", "ABC").request().get(String.class);		
		assertEquals("Hello Query Param ABC", responseMsg);
		
	}
	
	
	@Test
	public void testGetHelloBefore() {

		String responseMsg = target.path("helloworld/before/").request()
				.get(String.class);
		assertEquals("hello before", responseMsg);

	}


}

在资源实现类中包含了两个不同注解的方法@PathParam和@QueryParam,两种不同的方法调用方式也略有不同。各种不同的注解使用将在下一篇中介绍。

对于@PathParam,其调用方式为:

http://localhost:8090/NoteMail/rest/helloworld/ABC

对于@QueryParam,其调用方式为

http://localhost:8090/NoteMail/rest/helloworld/user?param=ABC

我们通过访问“服务根路径/application.wadl”(本示例为http://localhost:8090/NoteMail/rest/application.wadl)可以看到当前REST环境中所提供的REST服务器接口,WADL(Web Application Description Language)是用来描述基于HTTP的Rest式Web服务部署情况。



    
    
    
    
        
            
                
                    
                
            
            
                
                    
                        
                    
                
            
            
                
                    
                        
                    
                    
                        
                    
                
            
            
                
                
                    
                        
                    
                
            
        
        
            
                
                    
                    
                
                
                    
                    
                
            
            
                
                    
                    
                
            
            
                
                
                    
                        
                        
                        
                    
                    
                        
                        
                    
                
                
                    
                        
                    
                
                
                    
                        
                        
                    
                
            
            
                
                    
                        
                    
                    
                        
                        
                    
                
            
            
                
                    
                        
                    
                
            
        
        
            
                
                
                    
                        
                    
                
            
            
                
                
                    
                        
                    
                
            
        
        
            
                
                    
                
            
            
                
                
                    
                        
                    
                
            
        
        
            
                
                    
                
            
            
                
                
                    
                        
                    
                
            
        
        
            
                
                    
                    
                    
                    
                    
                    
                    
                    
                
                
                    
                
            
            
                
                    
                        
                    
                    
                        
                    
                
            
        
        
            
                
                    
                
                
                    
                    
                
            
            
                
                    
                    
                
            
        
        
            
                
                
                    
                        
                    
                
            
            
                
                
                    
                        
                    
                
            
        
    






你可能感兴趣的:(Java)