RESTful WebService和web service的区别

时间:2022-06-06 05:29:30

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 

RESTful WebService和web service的区别

上面的 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<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配置文件

<?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 WebService和web service的区别

因为 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特性。