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

Goodboy82862206


我们在平时的开发项目中,有好多人问我们在设计底层服务的时候到底是应该选择目前最流行的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服务,这种使用方式是没有意义的。


啰嗦的老邬


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(); }/<user>

WebService 实现类

class MyServiceImpl implements IMyService { private HashMap<string> users = new HashMap<string>(); 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; } }/<user>/<user>/<user>/<string>/<string>

spring -cxf.xml配置文件

<beans> <bean> <server> <servicebeans> /<servicebeans> /<server> /<beans>

web.xml 文件配置

<web-app> <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> <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\t: main * @Description\t: JaxRs测试客户端 * @param args */ public static void main(String[] args) { IMyService myService = JAXRSClientFactory.create("http://localhost:8096/cxf02/services/myservice\

Echa攻城狮


目前,Web Service主要有两大流派:

  • 1、基于SOAP的Web Service : SOAP(简单对象访问协议)是一种基于XML的协议,用以访问Web Service。其接口以机器可处理的格式进行描述,称为WSDL(Web服务定义语言)文档。通过使用标准的的XML文档来描述Web Service,在XML文件中,会详细记录接口的信息,如消息的格式、传输协议以及交互的位置等信息。
  • 2、基于REST的Web Service :REST(Representational State Transfer)是一种软件架构,它使用JSON来描述数据格式,最重要的是HTTP传输协议对REST来说是非必须的。

下面,通过一张表格来对比REST与SOAP之间的异同:

当然,目前流行的还是restful 风格的web服务,而且restful用json,应用调用效类更高!


程序君


大家好,首先呢,在这里我非常荣幸可以有这个机会为你解答这个问题,这让我感到十分开心,下面呢,让我们一起了解一下这个问题,现在让我们一起探讨一下吧。

restful增删改查 几十年的东西了 ,他只适合傻瓜式的API接口,并不适合现在高定制型的客户端业务

而webservice 是定制化的接口更适合于当前客户端业务

简单来说就是你的页面需要定制功能,这时restful非常的蹩手蹩脚了

以上这些就是我对于这个问题的一些个人看法和见解,我最后在这里,祝大家每天工作开开心心,生活快快乐乐,健康生活每一天,家和万事兴,年年发大财,生意兴隆,谢谢!


科技嘿嘿


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


风云code


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

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


代码接盘侠


从实际应用的角度做一个说明,ws和rf都是分布式远程调用的规范和方法,rf更适合于内部系统节点之间的通信,而ws更适合于外部暴露的接口,比如用于互联网对外公开的服务。


手机用户54444147856


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


分享到:


相關文章: