人文艺术 > webservice接口和restful接口哪个更好?

webservice接口和restful接口哪个更好?

2020-10-13 09:05阅读(63)

webservice接口和restful接口哪个更好?:我们在平时的开发项目中,有好多人问我们在设计底层服务的时候到底是应该选择目前最流行的RestFul架构还是选择老牌的we:

1

我们在平时的开发项目中,有好多人问我们在设计底层服务的时候到底是应该选择目前最流行的RestFul架构还是选择老牌的webService呢?今天我就将这两个概念做一下描述,看看到底什么情况下选择什么比较合理。

  首先我们需要了解:REST是一种架构风格,其核心是面向资源;而webService底层SOAP协议,主要核心是面向活动;

  那么什么是SOAP,我想不用多说,百度一下满眼都是。其实SOAP最早是针对RPC的一种解决方案,简单对象访问协议,很轻量,同时作为应用协议可以基于多种传输协议来传递消息(Http,SMTP等)。但是随着SOAP作为WebService的广泛应用,不断地增加附加的内容,使得现在开发人员觉得SOAP很重,使用门槛很高。在SOAP后续的发展过程中,WS一系列协议的制定,增加了SOAP的成熟度,也给SOAP增加了负担。  

  REST其实并不是什么协议也不是什么标准,而是将Http协议的设计初衷作了诠释,在Http协议被广泛利用的今天,越来越多的是将其作为传输协议,而非原先设计者所考虑的应用协议。SOAP类型的WebService就是最好的例子,SOAP消息完全就是将Http协议作为消息承载,以至于对于Http协议中的各种参数(例如编码,错误码等)都置之不顾。其实,最轻量级的应用协议就是Http协议。Http协议所抽象的get,post,put,delete就好比数据库中最基本的增删改查,而互联网上的各种资源就好比数据库中的记录,对于各种资源的操作最后总是能抽象成为这四种基本操作,在定义了定位资源的规则以后,对于资源的操作通过标准的Http协议就可以实现,开发者也会受益于这种轻量级的协议。

  REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性。REST提出设计概念和准则为:

  1. 网络上的所有事物都可以被抽象为资源(resource)

  2. 每一个资源都有唯一的资源标识(resource identifier),对资源的操作不会改变这些标识

  3. 所有的操作都是无状态的

  REST简化开发,其架构遵循CRUD原则,该原则告诉我们对于资源(包括网络资源)只需要四种行为:创建,获取,更新和删除就可以完成相关的操作和处理。我们可以通过统一资源标识符(Universal Resource Identifier,URI)来识别和定位资源,并且针对这些资源而执行的操作是通过 HTTP 规范定义的。其核心操作只有GET,PUT,POST,DELETE。由于REST强制所有的操作都必须是stateless的,这就没有上下文的约束,如果做分布式,集群都不需要考虑上下文和会话保持的问题。极大的提高系统的可伸缩性。

  SOAP webService有严格的规范和标准,包括安全,事务等各个方面的内容,同时SOAP强调操作方法和操作对象的分离,有WSDL文件规范和XSD文件分别对其定义。

  如果从这个意义上讲,是否使用REST就需要考虑资源本身的抽象和识别是否困难,如果本身就是简单的类似增删改查的业务操作,那么抽象资源就比较容易,而对于复杂的业务活动抽象资源并不是一个简单的事情。比如校验用户等级,转账,事务处理等,这些往往并不容易简单的抽象为资源。

  其次如果有严格的规范和标准定义要求,而且前期规范标准需要指导多个业务系统集成和开发的时候,SOAP风格由于有清晰的规范标准定义是明显有优势的。我们可以在开始和实现之前就严格定义相关的接口方法和接口传输数据。(很多情况下是为了兼容以前项目且前台调用逻辑代码都不能动的前提下,更改底层应用,一般就需要使用webService模式开发,因为老代码中已经有了明确的方法定义以及参数类型、个数等申明)

  简单数据操作,无事务处理,开发和调用简单这些是使用REST架构风格的优势。而对于较为复杂的面向活动的服务,如果我们还是使用REST,很多时候都是仍然是传统的面向活动的思想通过转换工具再转换得到REST服务,这种使用方式是没有意义的。

2

REST是一种架构风格,其核心是面向资源,遵循CRUD原则,这个原则告诉我们对于资源只需要4种行为,分别是:创建,获取,更新和删除,并且这些资源执行的操作时通过HTTP协议规定的,而WebService底层是SOAP协议,核心是面向活动,有严格的规范和标准,包括安全,事务等方面。

那么我们是使用RESTful还是WebService就需要考虑资源本身的 ,看资源本身是那种简单的类似增删改查的业务操作,还是那种比较复杂,如转账,事务处理等。其次是看是否有严格的规范和标准的,而且有多个业务系统集成和开发的时候,我们使用SOAP协议就比较优势,如果是简单的数据操作,无事务处理,开发和调用比较简单的话使用REST架构风格比较有优势,较为复杂的面向活动的服务,我们使用REST意义不大。

3

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

实体类

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

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

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

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

<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 方式

代码如下

class MyClient { /** @MethodName : main * @Description : JaxRs测试客户端 * @param args */ public static void main(String[] args) { IMyService myService = JAXRSClientFactory.create(\"http://localhost:8096/cxf02/services/myservice\

4

内部系统用web service 兼容性强,外部系统用restful效率高

5

其实webservicr和restful都是基于http的接口调用,webdervice用xml,restful用json,传输效率来讲,restful好点

6

RESTful 是一种接口API,web service 不是接口,它是一种服务。两个概念不应该相提并论。

实践中,REST 和 SOAP 是 web services 中两个比较常见的接口 API。有时候,JSON 也被看成是其中的另外一个接口。

因此,一般人会问:作为 web services 的两个接口技术,REST 与 SOAP 那个更具有优势?

答案:

随着数据科学和人工智能的发展,尤其是访问不同数据源的需要,RESTful 接口更加强大和流行。目前看,所有数据库都支持 REST API。当然,许多企业仍然使用比较传统的 SOAP API,因为他们相信这个接口更加安全。

事实上,不存在 SOAP 比 REST 更加安全的判断,或者认为 REST 不安全的顾虑是不必要的,也是不存在的。

本质上,信息技术安全是另外一方面的技术。两个接口对安全都有相应的处理机制,都安全。相对而言,除效率高外,RESTful API 更加安全。

可以看看这个博文:

https://raygun.com/blog/soap-vs-rest-vs-json/

关于REST安全,可以看看下面博文:

https://www.netsparker.com/blog/web-security/rest-api-web-service-security/