β

Rest和SOAP补记

人月神话的BLOG 7 阅读


对于谈Restful接口,有两个重点,一个是http无状态接口,一个是ROA面向资源。

因此要了解清楚Restful接口,首先还是要理解清楚一个Http请求的结构和响应输出结构。HTTP请求是指从客户端到服务器端的请求消息。包括:消息首行中,对资源的请求方法、资源的标识符及使用的协议。从客户端到服务器端的请求消息包括,消息首行中,对资源的请求方法、资源的标识符及使用的协议。

HTTP请求信息由3部分组成:

l   请求方法URI协议/版本
l   请求头(Request Header)
l   请求正文

HTTP应答与HTTP请求相似,HTTP响应也由3个部分构成,分别是:

l  状态行
l  响应头(Response Header)
l  响应正文

在接收和解释请求消息后,服务器会返回一个HTTP响应消息。状态行由协议版本、数字形式的状态代码、及相应的状态描述,各元素之间以空格分隔。格式:    HTTP-Version Status-Code Reason-Phrase CRLF

可以看一个Http Get请求的例子,如下

  1.GET /index.jsp HTTP/1.1
  2.Accept-Language: zh-cn
  3.Connection: Keep-Alive
  4.Host: 192.168.0.106
  5.Content-Length: 37
  6.userName=new_andy&password=new_andy

请求包的第一行是方法-URI-协议/版本:GET就是请求方法,根据HTTP标准,HTTP协议请求可以使用多种请求方法?HTTP 1.1支持七种请求方法:GET,POST,PUT,DELETE,HEAD,OPTIONS和TRACE等。

而对于Http Rest接口则用的前面标准的四种Http请求方法。

/index.jsp表示URI,URI指定了要访问的网络资源,后面的HTTP/1.1是协议和协议的版本信息。最后一行userName=new_andy&password=new_andy为正文。

资源和ROA面向资源的架构方法


要理解Http Restful接口和架构,另外一个核心就是资源,资源本身就是一个完整的实体信息,可以是一段文本,也可以是图像或者图片。同时可以用XML,JSON,二进制等多种方式表示资源。而当前对于结构化数据的Rest接口,更多的采用Json做为数据表达格式。

如果是结构化数据,对于资源容易理解成数据库中的数据表,但是可以看到很多业务对象是多张数据库表的组合,简单理解成数据库表不合适。其次,资源是否可以理解为类似SOA架构中的业务对象或实体,这个理解也不完整,因为还存在一种情况一个资源表达的信息可能并没有完整的业务实体含义,仅仅是一个实体信息而已。

所以最简单定义还是资源是一个实体信息,里面包含了我们需要的数据信息。

REST架构风格和Http Rest接口基础

基于前面谈到的,要认识Http Rest接口核心的就是其一是基于Http的标准接口,其二是ROA面向资源。

a)对于Http的标准接口,当前支持四种标准的Http接口

GET(SELECT):从服务器取出资源(一项或多项)。
POST(CREATE):在服务器新建一个资源。
PUT(UPDATE):在服务器更新资源(客户端提供完整资源数据)。
DELETE(DELETE):从服务器删除资源。

即我们场景的CRUD操作,都可以通过以上四种标准的Http接口完成。

b) URI资源标识

可以用一个URI(统一资源定位符)指向资源,即每个URI都对应一个特定的资源。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或识别符。一般的,每个资源至少有一个URI与之对应,最典型的URI即URL。

对于REST接口服务和SOAP的核心区别点

要理解SOAP,首先要进一步了解RPC远程对象访问协议和框架。对于早期的Web Service服务接口,基于是基于XML-RPC方式,到了SOAP WebSerivce则变化为Http+XML+RPC的一个组合。

即RPC协议可以基于TCP,也可以基于HTTP,而对于SOAP WebService一般则是基于Http协议的。而对于Http Restful WebService也是基于Http协议。

而对于SOAP本身又是对RPC框架的进一步封装,有相当严格的消息头,报文信封和报文内容格式的要求,也有明确的调用方法接口,接口传递数据格式的约束。而对于REST接口则是准确Http标准请求即可。

其次SOAP的服务接口一般只启用了HTTP POST,正是由于这个原因可以看到对于任何一个数据对象的CRUD操作,我们需要开发和定义四个不同的CRUD接口方法才能完成。而对于REST接口则更加简单,只需要定义清楚资源实体和URI标识,然后通过传递HTTP请求的不同类型来完成CRUD操作

对于SOAP和REST我们经常谈到的区别是内容是走XML还是JSON格式,是否有很强的契约规范约束方面,但是从上面的分析可以看到,其最核心的区别还是在ROA面向资源架构风格上面。

资源和领域对象的概念类似,但是不能完全划等号,同时资源的定义和设计仍然体现了SOA架构中常谈到的可复用特性。这是在资源设计中的一个重点。

具体更加详细的内容参考如下资料:

Restful API编写指南:http://blog.igevin.info/posts/restful-api-get-started-to-write/
Restful 架构风格:http://blog.igevin.info/posts/restful-architecture-in-general/


作者:人月神话的BLOG
原文地址:Rest和SOAP补记, 感谢原作者分享。

发表评论