RESTful WebService和web service的区别

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

实体类

 
  1. package com.tgb.cxf.server;

  2.  
  3. import javax.xml.bind.annotation.XmlRootElement;

  4.  
  5. //一定要使用XmlRootElement注解进行标注

  6. @XmlRootElement(name="user")

  7. public class User {

  8.  
  9. private String id;

  10. private String name;

  11.  
  12. public String getId() {

  13. return id;

  14. }

  15. public void setId(String id) {

  16. this.id = id;

  17. }

  18. public String getName() {

  19. return name;

  20. }

  21. public void setName(String name) {

  22. this.name = name;

  23. }

  24.  
  25. }

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 接口

 
  1. @Path("/userservice/")

  2. public interface IMyService {

  3.  
  4. @Path("/addUser/")

  5. @POST

  6. Response addUser(User user);

  7.  
  8. @Path("/delUser/{id}/")

  9. @DELETE

  10. Response delUser(@PathParam("id") String id);

  11.  
  12. @Path("/updateUser/")

  13. @PUT

  14. Response updateUser(User user);

  15.  
  16. @Path("/getUserById/{id}/")

  17. @GET

  18. @Produces("application/json")//返回json数据格式

  19. User getUserById(@PathParam("id") String id);

  20.  
  21. @Path("/")

  22. @GET

  23. @Produces("application/json")//返回json数据格式

  24. List<User> findAllUsers();

  25. }

("/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 实现类

 
  1. public class MyServiceImpl implements IMyService {

  2.  
  3. private HashMap<String, User> users = new HashMap<String,User>();

  4.  
  5. public MyServiceImpl(){

  6. init();

  7. }

  8.  
  9. public Response addUser(User user) {

  10.  
  11. users.put(user.getId(), user);

  12. System.out.println("添加用户成功");

  13. System.out.println(users.size());

  14. System.out.println(users.get("2").getName());

  15. return Response.ok().build();

  16. }

  17.  
  18.  
  19. public Response delUser(String id) {

  20. users.remove(id);

  21. System.out.println(users.size());

  22. return Response.ok().build();

  23. }

  24.  
  25.  
  26. public Response updateUser(User user) {

  27. users.put(user.getId(), user);

  28. System.out.println(users.get("1").getName());

  29. return Response.ok().build();

  30. }

  31.  
  32.  
  33. public User getUserById(String id) {

  34. return users.get(id);

  35. }

  36.  
  37.  
  38.  
  39. private void init(){

  40. User user = new User();

  41. user.setId("1");

  42. user.setName("温欢");

  43. users.put(user.getId(), user);

  44. }

  45.  
  46.  
  47. public List<User> findAllUsers() {

  48. List<User> userlist = new ArrayList<User>();

  49. userlist.add(users.get("1"));

  50. return userlist;

  51. }

  52.  
  53. }

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

 
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <beans xmlns="http://www.springframework.org/schema/beans"

  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  4. xmlns:jaxrs="http://cxf.apache.org/jaxrs"

  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

  6. http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">

  7.  
  8. <!--

  9.  
  10. 注意这里的jaxrs命名空间需要大家手动添加

  11.  
  12. -->

  13.  
  14. <!-- 发布webservice -->

  15. <bean id="serviceBean" class="com.tgb.cxf.server.MyServiceImpl"/>

  16. <jaxrs:server id="userService" address="/myservice">

  17. <jaxrs:serviceBeans>

  18. <ref bean="serviceBean"/>

  19. </jaxrs:serviceBeans>

  20. </jaxrs:server>

  21.  
  22. </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 文件配置

 
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <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">

  3.  
  4. <!-- 配置spring -->

  5. <context-param>

  6. <param-name>contextConfigLocation</param-name>

  7. <param-value>classpath:config/spring-cxf.xml</param-value>

  8. </context-param>

  9.  
  10. <listener>

  11. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

  12. </listener>

  13.  
  14. <!-- 配置cxf servlet -->

  15. <servlet>

  16. <servlet-name>cxf</servlet-name>

  17. <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

  18. <load-on-startup>1</load-on-startup>

  19. </servlet>

  20.  
  21. <servlet-mapping>

  22. <servlet-name>cxf</servlet-name>

  23. <url-pattern>/services/*</url-pattern>

  24. </servlet-mapping>

  25.  
  26. </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 方式

代码如下

 
  1. public class MyClient {

  2.  
  3. /** @MethodName : main

  4. * @Description : JaxRs测试客户端

  5. * @param args

  6. */

  7. public static void main(String[] args) {

  8. IMyService myService = JAXRSClientFactory.create("http://localhost:8096/cxf02/services/myservice",IMyService.class);

  9.  
  10. User user = myService.getUserById("1");

  11. System.out.println(user.getName());

  12.  
  13. User user = new User();

  14. user.setId("2");

  15. user.setName("委座");

  16. myService.addUser(user);

  17.  
  18. /*User user = new User();

  19. user.setId("1");

  20. user.setName("123");

  21. myService.updateUser(user);*/

  22.  
  23.  
  24. myService.delUser("1");

  25.  
  26. System.out.println(myService.findAllUsers().get(0).getName());

  27. }

  28.  
  29. }

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值