实体类
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
WebService 实现类
public class MyServiceImpl implements IMyService { private HashMap
spring -cxf.xml配置文件
web.xml 文件配置
客户端
所需 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特性。