RESTful WebService和web service的区别

2024-11-29 02:47:39
推荐回答(1个)
回答(1):

实体类

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 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;  } }

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

客户端

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