https://blog.csdn.net/chen213wb/article/details/80330356
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;
-
}
-
}
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();
-
}
("/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;
-
}
-
}
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配置文件
-
<?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>
<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>
<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());
-
}
-
}
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特性。