RESTful风格的webservice越来越流行了,sun也推出了RESTful WebService的官方规范:JAX-RS,全称:Java API for RESTful WebService。该规范定义了一系列的注解
RESTful简化了web service的设计,它不再需要wsdl,也不再需要soap协议,而是通过最简单的http协议传输数据(包括xml或json)。既简化了设计,也减少了网络传输量(因为只传输代表数据的xml或json,没有额外的xml包装)
下面为大家介绍使用cxf开发RESTful WebService
Cxf2.7实现了大部分的jax-rs规范,从cxf3.0开始实现jax-rs的全套规范
Spring3+cxf开发RESTfulweb service
服务端jar包
上面的jettison jar包是用来将jaxb扩展为为json支持的jar
实体类
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 findAllUsers();
}
WebService实现类
public class MyServiceImpl implements IMyService {
private HashMap users = new HashMap();
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 findAllUsers() {
List userlist = new ArrayList();
userlist.add(users.get("1"));
return userlist;
}
}
spring-cxf.xml配置文件
web.xml文件配置
contextConfigLocation
classpath:config/spring-cxf.xml
org.springframework.web.context.ContextLoaderListener
cxf
org.apache.cxf.transport.servlet.CXFServlet
1
cxf
/services/*
客户端
所需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特性。