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 包

webservice和RestFul的区别_第1张图片

上面的 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 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 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;
  }

} 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/*
    



  
  
  
  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());
    }
  
  } 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特性。

你可能感兴趣的:(WebServices,RestFul)