開發RESTful WebService

RESTful風格的webservice愈來愈流行了,sun也推出了RESTful WebService的官方規範:JAX-RS,全稱:Java API for RESTful WebService。該規範定義了一系列的註解
java

 

RESTful簡化了web service的設計,它再也不須要wsdl,也再也不須要soap協議,而是經過最簡單的http協議傳輸數據(包括xmljson)。既簡化了設計,也減小了網絡傳輸量(由於只傳輸表明數據的xmljson,沒有額外的xml包裝)web

 

下面爲你們介紹使用cxf開發RESTful WebServicespring

 

Cxf2.7實現了大部分的jax-rs規範,從cxf3.0開始實現jax-rs的全套規範apache

 

服務端

 

Spring3+cxf開發RESTfulweb servicejson

 

 

服務端jar網絡

 

 

上面的jettison jar包是用來將jaxb擴展爲爲json支持的jarapp

package com.tgb.cxf.server;

import javax.xml.bind.annotation.XmlRootElement;

//必定要使用XmlRootElement註解進行標註
@XmlRootElement(name="user")
public class User {
	
	private String id;
	private String name;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}

WebService接口工具

@Path("/userservice/")
public interface IMyService {
	
	@Path("/addUser/")
	@POST
	Response addUser(User user);
	
	@Path("/delUser/{id}/")
	@DELETE
	Response delUser(@PathParam("id") String id);
	
	@Path("/updateUser/")
	@PUT
	Response updateUser(User user);
	
	@Path("/getUserById/{id}/")
	@GET
	@Produces("application/json")//返回json數據格式
	User getUserById(@PathParam("id") String id);
	
	@Path("/")
	@GET
	@Produces("application/json")//返回json數據格式
	List<User> findAllUsers();
}

WebService實現類測試

public class MyServiceImpl implements IMyService {

	private HashMap<String, User> users = new HashMap<String,User>();
	
	public MyServiceImpl(){
		init();
	}
	
	public Response addUser(User user) {

		users.put(user.getId(), user);
		System.out.println("添加用戶成功");
		System.out.println(users.size());
		System.out.println(users.get("2").getName());
		return Response.ok().build();
	}


	public Response delUser(String id) {
		users.remove(id);
		System.out.println(users.size());
		return Response.ok().build();
	}


	public Response updateUser(User user) {
		users.put(user.getId(), user);
		System.out.println(users.get("1").getName());
		return Response.ok().build();
	}


	public User getUserById(String id) {
		return users.get(id);
	}
	
	
	
	private void init(){
		User user = new User();
		user.setId("1");
		user.setName("溫歡");
		users.put(user.getId(), user);
	}

	
	public List<User> findAllUsers() {
		List<User> userlist = new ArrayList<User>();
		userlist.add(users.get("1"));
		return userlist;
	}

}

spring-cxf.xml配置文件ui

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:jaxrs="http://cxf.apache.org/jaxrs"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
	 http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
	
	<!-- 
			
			注意這裏的jaxrs命名空間須要你們手動添加 
			
	-->
	
	<!-- 發佈webservice -->
	<bean id="serviceBean" class="com.tgb.cxf.server.MyServiceImpl"/>
	<jaxrs:server id="userService"  address="/myservice">
		<jaxrs:serviceBeans>
			<ref bean="serviceBean"/>
		</jaxrs:serviceBeans>
	</jaxrs:server>
	
</beans>

web.xml文件配置

<?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 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  
  <!-- 配置spring -->
  <context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>classpath:config/spring-cxf.xml</param-value>
  </context-param>
  
  <listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  
  <!-- 配置cxf servlet -->
  <servlet>
        <servlet-name>cxf</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>cxf</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>

</web-app>

客戶端

 

所需jar

 

 

由於RESTful就是利用最原始的http協議傳輸數據,因此客戶端其實就是一個http客戶端,有如下幾種實現方式

 

 

JAX-RS Client API--cxf3.0+

Proxy【使用起來簡單,代理封裝通訊細節】

Apache HttpClient

WebClient

 

爲了簡單我使用了Proxy方式

代碼以下

    public class MyClient {
    
        /** @MethodName    : main
         * @Description    : JaxRs測試客戶端
         * @param args
         */
        public static void main(String[] args) {
            IMyService myService = JAXRSClientFactory.create("http://localhost:8096/cxf02/services/myservice",IMyService.class);
            
            User user = myService.getUserById("1");
            System.out.println(user.getName());
            
            User user = new User();
            user.setId("2");
            user.setName("委座");
            myService.addUser(user);
            
            /*User user = new User();
            user.setId("1");
            user.setName("123");
            myService.updateUser(user);*/
            
            
            myService.delUser("1");
            
            System.out.println(myService.findAllUsers().get(0).getName());
        }
    
    }

 

你們可使用TCPMON這個工具監控如下,能夠看到http body中只是簡單的json串,沒有像soap協議那樣的「信封」包裝

 

使用RESTful設計風格+傳輸json數據格式 能夠大大的簡化web service的設計 並提升傳輸效率

 

其實springMVC也採用了RESTful的設計風格,不過它使用的是spring本身的註解,這些註解和jax-rs中的註解驚奇的相似。若是你們有興趣能夠研究一下springMVC的RESTful特性。

相關文章
相關標籤/搜索