webservice和RestFul的区别

RESTful WebService和web service的区别

 

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

  • 9
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: WebService 是一种通信协议,是基于 SOAP 协议和 XML 格式的。它允许不同平台和语言之间进行通信。 而 RESTful 是一种 Web 服务架构风格,它基于 HTTP 协议和 URI(统一资源标识符)、纯文本等简单格式。它被认为是一种轻量级的 Web 服务架构。 总之,WebService是一个协议标准,而RESTful是一种设计架构风格。 ### 回答2: Web服务(WebService)是一种多种应用程序之间数据交换的技术。Web服务依靠HTTP进行通信,并支持多种编程语言。在Web服务中,客户端和服务端之间会有一定的协议,如SOAP或XML-RPC,用于封装数据并交换。Web服务可以运行在任何平台上,并且依靠传统的标准协议,并不受特定技术或架构限制。Web服务通常使用WSDL和UDDI进行描述和发现。 REST(Representational State Transfer)是一种基于HTTP协议的软件架构风格,允许使用Web服务来进行通信。REST并不是一种标准,而是一种设计模式。REST的原则包括:资源标识、统一接口、无状态、可缓存、分层系统和代码按需执行。RESTful服务是指符合REST原则的Web服务,可以通过GET、POST、PUT和DELETE等HTTP方法进行通信。 Web服务和RESTful区别主要在于以下几个方面: 1. 数据格式:Web服务通常使用XML或JSON作为数据格式进行交换,而RESTful服务通常使用JSON或XML。 2. 路径设计:Web服务通常使用RPC或SOAP协议进行传输,并使用动词作为服务操作的标识,如“getCustomer”,而RESTful服务则使用名词来标识资源,并使用HTTP方法作为操作标识,如“GET /customer/1”。 3. 接口设计:Web服务的接口具有较高的耦合性,需要客户端和服务端都遵循约定的协议,而RESTful服务则具有较低的耦合性,可以允许客户端和服务端根据需要进行适当的调整和修改。 4. 性能表现:由于RESTful服务使用HTTP协议进行通信,因此具有较好的性能表现和可伸缩性,而Web服务更多地依赖于SOAP等协议,通常具有较差的性能。 总之,Web服务和RESTful服务各有优缺点,选择适合自己的服务类型需要根据具体需求进行考虑。 ### 回答3: WebServiceRESTful是两种常用的Web服务架构。WebService起源于SOAP协议,RESTful起源于Web的本质。虽然两种架构都可以用于创建基于Web的分布式应用程序,并具有基本的服务架构,但它们在使用方面有很大的不同。 1. 传输协议 WebService可以使用多种传输协议:HTTP、TCP、SMTP和SOAP等。而RESTful只使用HTTP协议。RESTful简化了系统的整体架构,减少了不必要的组件,降低了系统的负载。 2. 数据格式 WebService使用XML格式来传输数据,而RESTful可以使用多种数据格式:XML、JSON等。由于RESTful使用JSON格式,可以更轻松地在不同系统之间共享数据,因为JSON比XML更轻巧。 3. 跨平台性 Web服务需要利用各种平台特定的API进行访问。而RESTful服务是基于Web的,使用标准HTTP,因此可以使用任何支持http通信的开发语言进行访问。这使得RESTful服务在跨平台性方面具有优势。 4. 缓存处理 RESTful服务在缓存处理方面更容易实现,因为它使用HTTP本身来管理缓存。WebService没有使用标准的缓存处理机制。 综上所述,RESTful服务架构比WebService架构更容易实现,更有效地处理请求和响应、可扩展、更具标准性。它更适合Web和移动应用程序开发。虽然已有许多遗留的WebService应用程序,但是在新项目中,使用RESTful服务架构会是一个更好的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值