RESTful風格的webservice愈來愈流行了,sun也推出了RESTful WebService的官方規範:JAX-RS,全稱:Java API for RESTful WebService。該規範定義了一系列的註解
java
RESTful簡化了web service的設計,它再也不須要wsdl,也再也不須要soap協議,而是經過最簡單的http協議傳輸數據(包括xml或json)。既簡化了設計,也減小了網絡傳輸量(由於只傳輸表明數據的xml或json,沒有額外的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特性。