搜档网
当前位置:搜档网 › REST Service 的最佳实践,第 1 部分 重新解析 REST Service

REST Service 的最佳实践,第 1 部分 重新解析 REST Service

REST Service 的最佳实践,第 1 部分 重新解析 REST Service
REST Service 的最佳实践,第 1 部分 重新解析 REST Service

REST Service 的最佳实践,第1 部分: 重新解析REST Service

马春娥, 软件工程师, IBM

简介:自从Roy Fielding 于2000 年发表那篇经典的论文已有10 余载,人们真正开始认可并使用REST 已有 4 年左右的时间。关于REST 的介绍的文章也有一些。但是笔者在社区里面发现,很多程序员对REST 还存在很多概念上的误解和实现上的疑问。本系列文章根据使用和构建REST 服务的几年的经验,提炼出了一些心得和最佳实践,分享给大家。本文是这个REST Service 最佳实践系列的第一篇。在本文中,笔者会以全新的视角来剖析REST 服务,详细的讲解REST 里面的几个核心概念,流行的架构,进一步帮助读者理解REST。最后讲述一个真正基于REST 架构风格构建的应用,给读者更直观的感觉。

查看本系列更多内容

标记本文!

发布日期: 2011 年 1 月24 日

级别:中级

访问情况 60 次浏览

三种流行web 服务的架构

Web 服务是一种面向服务的架构的技术,通过标准的Web 协议提供服务,目的是保证不同平台的应用服务可以互操作。根据W3C 的定义,Web 服务(Web service)应当是一个软件系统,用以支持网络间不同机器的互动操作。网络服务通常是许多应用程序接口(API)所组成的,它们通过网络,例如国际互联网(Internet)的远程服务器端,执行客户所提交服务的请求。流行的或者曾经流行的Web 服务架构有三种:SOAP RPC over HTTP, XML RPC over HTTP, 和REST over HTTP。下面分别简要介绍这三种架构。SOAP RPC over HTTP

简单对象访问协议(SOAP,全写为Simple Object Access Protocol)是一种标准化的通讯规范,主要用于Web 服务(web service)中。SOAP 的出现是为了简化网页服务器(Web Server)在从XML 数据库中提取数据时,无需花时间去格式化页面,并能够让不同应用程序之间透过HTTP 通讯协定,以XML格式互相交换彼此的数据,使其与编程语言、平台和硬件无关。

用一个简单的例子来说明SOAP 使用过程,一个SOAP 消息可以发送到一个具有Web Service 功能的Web 站点,例如,一个图书价格信息的数据库,消息的参数中标明这是一个查询消息,此站点将返回一个XML 格式的信息,其中包含了查询结果。由于数据是用一种标准化的可分析的结构来传递的,所以可以直接被第三方站点所利用。

SOAP RPC over HTTP,在HTTP 上传送SOAP 并不是说SOAP 会覆盖现有的HTTP 语义,而是HTTP 上的SOAP 语义会自然的映射到HTTP 语义。在使用HTTP 作为协议绑定的场合中,RPC 请求映射到HTTP 请求上,而RPC 应答映射到HTTP 应答。然而,在RPC 上使用SOAP 并不仅限于HTTP 协议绑定。SOAP 协议没有和HTTP 有很好的结合,没有利用HTTP 协议里面关于request 和response 的丰富词汇,而是鼓励应用设计人员定义任意的词汇(动词和名词),像getUsers(),savePurchaseOrder(...),getBookPrice() 等。SOAP RPC Request 通过HTTP POST 请求发送。清单1 和清单2 给出了SOAP RPC over HTTP 的request 和response 的示例。请求和响应是封装在SOAP Envelope 里面,以HTTP request 和response 的body 传送。

清单1. A SOAP Request over HTTP 示例

POST /books/bookquery HTTP/1.1

Host: https://www.sodocs.net/doc/334573509.html,

Content-Type: text/xml; charset="utf-8"

Content-Length: nnn

SOAPAction=""

xmlns:soap="https://www.sodocs.net/doc/334573509.html,/soap/envelope/"

xmlns:mh="https://www.sodocs.net/doc/334573509.html,/books">

123456

从清单 1 可以看出,soap envelope 是定义好的格式,它描述所要调用的方法和方法所需要的参数及其参数值,在HTTP 上,它作为HTTP request 的body 发送。

清单 2. A SOAP response over HTTP 示例

HTTP/1.1 200 OK

Content-Type: text/xml; charset='utf-8'

Content-Length: nnn

xmlns:soap="https://www.sodocs.net/doc/334573509.html,/soap/envelope/"

xmlns:mh=" https://www.sodocs.net/doc/334573509.html,/books" >

24.99

从清单 2 可以看出,soap envelope 封装了getBookPrice 的调用结果,在HTTP 上,它作为HTTP response 的body 返回回来。

XML RPC over HTTP

XML RPC over HTTP 和SOAP RPC over HTTP 从结构上看很类似。这种远程过程调用使用HTTP 作为传输协议,XML 作为传送信息的编码格式。XML-RPC 的定义尽可能的保持了简单,但同时能够传送、处理、返回复杂的数据结构。XML-RPC 是工作在Internet 上的远程过程调用协议。一个XML-RPC 消息就是一个请求体为XML 的HTTP POST 请求,被调用的方法在服务器端执行并将执行结果以XML 格式编码后返回。清单 3 和清单 4 给出了XML RPC over HTTP 的request 和response 的示例。请求和响应是封装在一个固定的格式里面,以HTTP request 和response 的body 传送。

清单 3. A XML RPC Request over HTTP 示例

POST /books/bookquery HTTP/1.1

Host: https://www.sodocs.net/doc/334573509.html,

Content-Type: text/xml; charset="utf-8"

Content-Length: nnn

Connection:keep-alive

getBookPrice

123456

从清单 3 可以看出,methodcall 是定义好的XML 格式,它描述所要调用的方法和方法所需要的参数及其参数值,在HTTP 上,它作为HTTP request 的body 发送。

清单 4. A XML RPC response over HTTP 示例

HTTP/1.1 200 OK

Content-Type: text/xml; charset='utf-8'

Content-Length: nnn

Connection: close

getBookPrice

24.99

从清单 4 可以看出,methodResponse 封装了getBookPrice 的调用结果,在HTTP 上,它作为HTTP response 的body 返回回来。

REST over HTTP

REST 风格的架构也并不强调和协议的绑定。HTTP 是WWW 网上广泛使用的并且被证明是有效的通信协议,所以现在RESTful 服务基本也是基于HTTP 协议的。资源是由URI 来指定。

对资源的操作包括获取、创建、修改和删除资源,这些操作正好对应HTTP 协议提供的GET、POST、PUT 和DELETE 方法。通过操作资源的representation 来操作资源。资源的representation 可以是XML 也可以是HTML,取决于读者是机器还是人,是消费web 服务的客户软件还是web 浏览器。当然也可以是任何其他的格式。清单 5 和清单 6 给出了REST over HTTP 的request 和response 的示例。

清单 5. A REST Request over HTTP 示例

GET /books/123456/xml HTTP/1.1

Host: https://www.sodocs.net/doc/334573509.html,

清单 6. A REST Response over HTTP 示例

HTTP/1.1 200 OK

Date: Fri, 10 Sept 2010 17:15:33 GMT

Last-Modified: Fri, 10 Sept 2010 17:15:33 GMT

ETag: "2b3f6-a4-5b572640"

Accept-Ranges: updated

Content-Type: text/xml; charset="utf-8"

Harry Potter

J K. Rowling

2005

24.99

从清单 5 和清单 6 种,可以清楚的看到,REST 在最大程度上充分利用了HTTP,没有增加额外的词汇和约定。

通过前面的分析和比较,我们可以清楚地看到,REST 风格的web 服务与SOAP RPC 和XML RPC 风格的web 服务相比,http request 更简单,response 的语意更清楚。而且客户端不需要知道那么多关于应用的细节,比如method name,method 调用的参数等等。

简言之,目前在三种主流的Web 服务实现方案中,因为REST 模式的Web 服务与复杂的SOAP 和

XML-RPC 对比来讲明显的更加简洁,越来越多的web 服务开始采用REST 风格设计和实现。例如,https://www.sodocs.net/doc/334573509.html, 提供接近REST 风格的Web 服务进行图书查找;雅虎提供的Web 服务也是REST 风格的。REST 风格的web 服务已被广泛的接受和使用,但是在使用的过程中,我们发现其实有很多号称RESTful 的web 服务并不是Roy 定义的REST 服务,或者违背了其中的一些约束。像Amazon 和Flickr 的web 服务。接下来,我们首先结合实际经验,重新解读REST 架构风格中的核心概念,帮助读者准确的掌握REST 架构,最后给出一个完全符合REST 风格架构的web 服务定义的例子。

回页首

REST 核心概念解读

Representational State Transfer

在理解REST 相关的核心概念之前,我们来看看“REST”本身应该怎么理解。“Representational State Transfer”是一个不完整的句子,“Representational”代表的是什么的“表示”?“State”又指的是什么的状态?“Transfer”的又是什么?如果我们要把它补全该如何呢?根据Roy 的论文和我们的实践,应该是“Application States Transfer among the resource ’ s representation”。这里的“State”指的是“应用”的“状态”,这个“状态”是用“资源的表示”来代表的,用户可以在“状态”之间“跳转”。

REST 架构风格定义的约束

REST 是一种架构的风格,它是对分布式hypermidea 系统的架构元素的抽象,提供了一些核心的概念和指导思想。这种架构风格是“客户端- 服务器”架构风格的一种,也就是说“客户端”发起“请求”,“服务器”处理“请求”并返回相应的结果。REST 的贡献是规定了一系列的方法论,在“请求”方面,规定“客户端”怎么发起“请求”,发的是什么样的“请求”,以什么协议发“请求”;在处理方面,规定“服务器”怎么响应“请求”,返回什么样的“响应”,系统后续应该怎么“跳转”等等。让我们再回顾Roy 定义的这些约束。

“无状态”(Stateless)

“客户端”和“服务器端”的交互是“无状态”的,也就是说“请求”之间是相互隔离的。“服务器端”不保存“客户端”的应用上下文(context),每个从“客户端”来的“请求”都必须包括所有的必要的信息让“服务器端”能够完全理解“请求”并处理。“客户端”存了很多“会话”的信息。让我们以搜索引擎为例来看看“有状态”和“无状态”的区别。图 1 和图 2 分别给出了两个搜索引擎的“有状态”和“无状态”的交互示例。

图 1. 无状态的搜索引擎的交互示例

图 1 所示是无状态的搜索引擎的请求(request)和响应(response)的实例。可以清楚地看出,每个request 和response 都是互相独立的,相互之间没有数据的依赖。每个request 包含服务器端响应这个request 所需要的所有信息。以“搜索SOAP”为例,用户首先发了request https://www.sodocs.net/doc/334573509.html,/search? q=SOAP,并且得到了搜索结果,其中包含了10 个最相关的搜索结果。这个交互过程就结束了,服务器端没有保存任何和这个请求相关的信息。但是在这个返回的状态中,服务器端把下一步的可能的状态嵌在其中了。比如用户如果在这些结果没有找到自己想要的结果,他可以翻页,翻到第二页。第二页是另一个状态,这时用户点击了第二页,然后客户端又发了一个request https://www.sodocs.net/doc/334573509.html,/search?

q=SOAP&start=10,这个request 了包含了所有的上下文,也就是“按关键字SOAP 搜索并且以第10 个搜索结果开始返回”。也就是说,服务器把当前的状态隐含中结果中返回,客户端保存下这些隐含的状态,而不是保存在服务器端。客户端可以根据服务器端返回来的状态构建下一个状态的请求。

“无状态”的好处是每个状态都有一个对应的URI,这些URI 可以bookmark,可以使得用户方便的在浏览器中前进后退,可以在用户希望的任何时候访问任意多次。

图 2. 有状态的搜索引擎的交互示例

图 2 是有状态的搜索引擎的request 和response 的交互示例。可以看出,request 之间的时序依赖性。以“搜索SOAP”为例,用户在看1~10 个搜索结果并想看11~20 个结果,客户端只需要发一个“start=10”的请求而是发“/search?q=SOAP&start=10”的请求,也就是客户端不用重复前面的request 的上下文。这使得HTTP request 相对简单了很多。但是他使得HTTP protocol 变得复杂。服务器端和客户端需要同步会话的状态,在可靠网络上,这是一个复杂的任务。

“无状态”带来了一些性能的提升。在“visibility”方面,对于监控系统而言,它不用去关心跨请求的数据对当前请求的影响,所以“visibility”有所提升。在“reliability”方面,由于“客户端”保存了很多“会话”数据,因此减少了部分“服务器”端的故障或者网络故障对应用的影响,因此对于用户来说,“reliability”有所提升。最值得一提的是“scalability”,由于“服务器”端能够独立的响应每个request,而不用依赖会话历史,因此少了很多“资源”的管理和同步,使得多个服务器可以同时服务不同的用户的请求,获得很好的自由扩展功能。

当然,事务都有两面性,“无状态”带来的不足之处包括可能的网络性能的降低,因为“服务器”会发很多重复的数据到不同的“客户端”,使得“客户端”保存所有的会话信息;这也导致了另一个问题,就是“服务器”将失去对应用的一致行为的一部分控制权,而且还对“客户端”的实现产生依赖。

“缓存”(Cacheable)

为了提高REST 风格架构的网络性能,Roy 加入了“缓存”的约束。“缓存”不是一个新的概念,HTTP 协议提供机制,使得“客户端”可以“缓存”一些数据。在“服务器”返回的“响应”中,可以隐式或者显式的指明数据的“缓存”属性,这样,“客户端”可以在未来使用“缓存”下来的数据,减少“客户端”和“服务器”端的交互次数,从而达到提高网络性能的目的。

统一的接口(Uniform Interface)

这是REST 风格的架构区别于其他架构的一个最关键的指标,就是REST 风格的架构对于任意应用,规定了统一的接口定义。接口定义包括四个部分:

l1)identification of resources(标识资源);

l2)manipulation of resources through representations(通过资源的表示来操作资源);

l3)self-descriptive messages(自描述的信息);

l4)hypermedia as the engine of application state(超媒体作为应用状态的引擎)

下面分别对这些概念进行解析。

Identification of resources

第一部分“identification of resources”讲了REST 架构风格的一个最核心的概念“Resource”以及“Resource”的“identification”。“Resource”是信息系统的一种抽象,可以是任何重要的足以把本身作为一个引用(reference)的事物。从应用的角度看,如果应用的用户需要“创建一个到它链接”,获取或者缓存它的“表示”,或者想对他做些操作,那么都可以创建一个“Resource”。一个“Resource”可以是现实世界的事物,比如一本书,一辆车,一栋房子;也可以是一个虚拟的概念,也可以是一个算法的结果。“identification”是“Resource”的全局唯一的标识,如果“Resource”没有identification,那么他不能称为“Resource”。用URI 来表示一个Resource 的identification。关于URI 的最佳实践包括URI 是自描述的,有结构的,这样可以使得“客户端”可以自己创建一些有预测性的请求。几个比较好的Resource URI 示例:

https://www.sodocs.net/doc/334573509.html,/books/123456

https://www.sodocs.net/doc/334573509.html,/softwares/im/db2/9.5

https://www.sodocs.net/doc/334573509.html,/blog/2010/09/10/1

https://www.sodocs.net/doc/334573509.html,/bugs/by-state/new

前面解释了什么是Resource,怎么用URI 来标识一个Resource,下面来看下Resource 和URI 的关系,他们之间是不是一一对应的呢?让我们来回答下面几个问题:1)两个URI 能指向同一个Resource 么?回答是肯定的。作为程序员,我们都有这样的经历,就是经常做一些release,让我们考虑这两个URI: https://www.sodocs.net/doc/334573509.html,/releases/3.1.1 和https://www.sodocs.net/doc/334573509.html,/releases/latest,在特定的时刻,他们指向的就是同一个resource,但是背后的概念是不一样的,一个是指向一个特定的release 版本号,一个是指向一个随着时间演进的resource,是两个完全不同的概念。所以一个resource 可以有一个或者多个URI 来标识。2)一个URI 能指向不同的resource 么?答案是否定的。这和Universal Resource Identifier 的原则相违背。

Manipulation of resources through representations

接着来看看“Representation”。Representation 是Resource 的表现形式。Resource 是信息系统的抽象,但是最终必须以人们能理解的一种形式提供出来。可以是一个XML 文档,HTML 文档,CSV,file 等等。一个Resource 可以有多种Representation。那么服务器端怎么知道用户想要哪个Representation 呢?通常来讲有两种方式:

1)在resource 的URI 里面指明,为不同的Representation 提供不同的URI。举个例子,我们有个book 的resource,我们提供几个不同的URI 来表示不同的representation。清单7、8、9 分别是XML、JSON、CSV 三种representation 的HTTP request 和response 的示例。

清单7. Representation 为XML 的request 和response 示例

GET /books/123456/xml HTTP/1.1

Host: https://www.sodocs.net/doc/334573509.html,

Reponse:

HTTP/1.1 200 OK

Date: Fri, 10 Sept 2010 17:15:33 GMT

Last-Modified: Fri, 10 Sept 2010 17:15:33 GMT

ETag: "2b3f6-a4-5b572640"

Accept-Ranges: updated

Content-Type: text/xml; charset="utf-8"

Harry Potter

J K. Rowling

2005

24.99

清单8. Representation 为JSON 的request 和response 示例

GET /books/123456/json HTTP/1.1

Host: https://www.sodocs.net/doc/334573509.html,

Reponse:

HTTP/1.1 200 OK

Date: Fri, 10 Sept 2010 17:15:33 GMT

Last-Modified: Fri, 10 Sept 2010 17:15:33 GMT

ETag: "2b3f6-a4-5b572640"

Accept-Ranges: updated

Content-Type: text/json; charset="utf-8"

[

"book":

{

"title":Harry Potter,

"author":J K. Rowling,

"year":2005,

"price":24.99

}

]

清单8. Representation 为CSV 的request 和response 示例

GET /books/123456/csv HTTP/1.1

Host: https://www.sodocs.net/doc/334573509.html,

Reponse:

HTTP/1.1 200 OK

Date: Fri, 10 Sept 2010 17:15:33 GMT

Last-Modified: Fri, 10 Sept 2010 17:15:33 GMT

ETag: "2b3f6-a4-5b572640"

Accept-Ranges: updated

Content-Type: text/csv; charset="utf-8"

title,author,year,price

Harry Potter,J K. Rowling,2005,24.99

2) 利用HTTP 的内容协商(content negotiation)机制。客户端可以利用“Accept”header 指明它希望的内容表示形式。还是拿book 的例子来说,客户端发的HTTP 请求如清单9 所示:

清单9. 利用content negotiation 机制请求representation 的request 示例

GET /books/123456 HTTP/1.1

Host: https://www.sodocs.net/doc/334573509.html,

Accept: text/xml

GET /books/123456 HTTP/1.1

Host: https://www.sodocs.net/doc/334573509.html,

Accept: text/json

GET /books/123456 HTTP/1.1

Host: https://www.sodocs.net/doc/334573509.html,

Accept: text/csv

对应的response 和第一种方式相同,所以忽略了。

相比较这两种方式,根据我们的经验,第一种方式更好,URI 是一种好的实践,用来表示resource 的各方面的信息,包括结果,版本,representation 形式,时间等等,它带来的好处是使客户端的工作大大降低,它很方便的可以在不同的应用之间共享。

那么怎么对resource 进行下一步的操作(“manipulation”)呢?REST 对Resource 的操作定义和HTTP method 是对应起来的。HTTP 协议定义GET、POST、PUT、DELETE 来表示对资源的获取、创建、更新和删除。“Manipulation of resources through representations”约束规定了resource 的操作是通过representation 来完成的,所以在resource 的representation 里面,需要包含对resource 的操作怎么进行。APP(ATOM Publishing Protocol)提供了一个最佳实践,是用 的方式指明Resource 响应的操作,下面是一个实例:

rel 定义了该link 的resource 和当前resource 的关系,href 定义了resource 的HTTP endpoint。所以当用户想更新id 为123456 的book 的价钱的时候,客户端会发一个PUT 请求到指定的URI,示例如清单10 所示:

清单10. 更新resource 的request 示例

PUT /books/123456 HTTP/1.1

Host: https://www.sodocs.net/doc/334573509.html,

Reponse:

HTTP/1.1 200 OK

Date: Fri, 10 Sept 2010 17:15:33 GMT

Last-Modified: Fri, 10 Sept 2010 17:15:33 GMT

Harry Potter

J K. Rowling

2005

31.99

同样,客户端可以发HTTP 请求去删除这个book,如清单11 所示。

清单11. 删除resource 示例

DELETE /books/123456 HTTP/1.1

Host: https://www.sodocs.net/doc/334573509.html,

Reponse:

HTTP/1.1 200 OK

Self-descriptive messages

REST 接口的定义强调了自描述“Self-descriptive”性。自描述性也是为了让客户端充分的理解当前的状态,下一步的状态怎么跳转。

前面讲了resource 的representation,只讲述了representation 的数据的一部分。在representation 里面,除了包含数据部分,还包括元数据,它是用来描述数据的信息,或者是一些客户端需要知道的一些领域知识。这里以ATOM 协议为例看看怎么在representation 里面提供自描述的信息。清单12 是一个ATOM 的片段。

清单12. 一个ATOM 形式的resource representation

xmlns:os="https://www.sodocs.net/doc/334573509.html,/-/spec/opensearch/1.1/"

xmlns:catalog="https://www.sodocs.net/doc/334573509.html,/opensearch/1.0">

2009-08-11T03:00:27.062Z

harry potter 相关的图书

0

10

10

Harry Potter

urn:id:23-27

2009-07-09T11:01:26.000Z

Harry Potter

J K. Rowling

2005

31.99

从上面的例子可以看出,除了 里面的内容是和book 数据相关的信息以外,剩下的信息都是描述性的信息,通常包括翻页信息:一共有多少页,前后翻页的link 是什么;分类信息,时间信息,还有一些文本信息供用户阅读。

总之,服务器端尽可能的返回详细的信息,帮助客户端理解当前的状态,以及发起下一个请求所需要的所有信息,以达到“服务器端无状态”和客户端发起“状态跳转”的目的。

Hypermedia as the engine of application state

“Hypermedia as the engine of application state”是“统一接口”的最后一个约束,也是最重要的一个约束,不幸的是,Roy 的REST 论文中对这个约束的解释特别少,在这里,我们根据我们的经验和理解,对这个约束进行描述。这个约束其实规定的是应用系统是通过Hypermedia 的方式在不同的状态之间跳转。这

句话听起来有点拗口,还是来看一个例子吧。

Flickr提供了REST API,以flickr.groups.members.getList 为例来看看这个REST API 的定义,清单13 是一个响应示例(sample response),可以看出“members”是一个resource,它是一系列“member”的集合,也就是说,它指向其他的resource。

清单13. flickr.groups.members.getList 的响应示例

iconfarm="1" membertype="2"/>

iconserver="0" iconfarm="0" membertype="4"/>

iconserver="0" iconfarm="0" membertype="2"/>

iconserver="1003" iconfarm="2" membertype="3"/>

...

如果用户还想对“Alpha Shanan”了解更多呢?这时,客户端会构建一个HTTP request,URI 为:

https://www.sodocs.net/doc/334573509.html,/services/rest/?

如果系统按照这种方式运行,问题在哪呢?客户端和服务器端需要有很多的共享的知识和约定,客户端需要知道获取人员信息的API 是method=flickr.people.getInfo 以user_id 作为参数。这不是Hypermedia,同时也违背了Roy 的关于“Hypermedia as the engine of application state”的约束,所以这个不是好的RESTful 的实现。

Hypermedia 的实质是hyperlink,用hyperlink 把这些相互依赖的resource 联系起来,这些hyperlink 是由服务器端生成并且在representation 里面返回来的,包括了当前的状态集合和可能的下一步的状态集合。客户端不需要任何domain specific 知识就能够实现状态的跳转。Hypermedia 类型的sample response 如清单14 所示。在清单14 中可以看到,resource 和resource 之间的联系通过hyperlink 关联起来,并且在resource 的representation 里面表示。

清单14. REST 风格的flickr.groups.members.getList 的sample response

username="foo" iconserver="1" iconfarm="1" membertype="2"/>

username="kewlchops666" iconserver="0" iconfarm="0" membertype="4"/>

username="Alpha Shanan" iconserver="0" iconfarm="0" membertype="2"/>

username="fakedunstanp1" iconserver="1003" iconfarm="2" membertype="3"/>

...

通过前面关于“统一接口”的解析,我们清楚地知道,REST 风格的架构使得web 服务的“客户端”和“服务器端”很好的分离开来。“客户端”不需要关心数据的存储,使得“客户端”的可移植性(portability)提高了。“服务器端”不用关心用户的接口和用户的状态,所以“服务器端”将变得更加简单,而且方便的获得更好的可伸缩性(scalability)。只要保持接口的定义不变,“客户端”和“服务器

端”可以独立的开发和演变。

回页首

一个定义良好的RESTful Web 服务接口

首先,用一个文档描述web 服务的capabilities 以及服务的location。如清单15 所示。

清单15. 用APP 协议描述的服务capabilities 和location

xmlns:atom="https://www.sodocs.net/doc/334573509.html,/2005/Atom">

InfoSphere MashupHub

All

application/atom+xml; type=entry

ALL

Feeds

application/atom+xml;type=entry

feeds

这个服务文档指明InfoSphere MashupHub 提供了一系列的web 服务,包括list 所有的资源,list 所有的feeds 等等。并且还描述了每个web 服务的location 可以提供的resource representation 的类型。这种描述文档对于web 服务的客户端来说非常有益。这个服务描述文档本身也是一个resource,可以用HTTP URI 定位到。

其次,我们来看一下每个web 服务是怎么定义的。

清单16. RESTful web 服务接口的定义示例

1) Resource:所有的feeds

2) Resource URI:

http://localhost:8080/mashuphub/atom?collection=feeds

3) Resource representation:

http://9.186.64.113:8080/mashuphub/atom?collection=feed

rel ="self">

2010-09-11 T 15:12:24.968Z

feeds Collection

InfoSphere MashupHub Search Feed

InfoSphere MashupHub Search Feed

MyCo Customer List

2010-09-07 T 05:08:52.000Z

urn:id:1460

rel="self">

rel="related" title = "MyCo Customer List with weather info" >

1.0

MyCo Customer List

admin

public

0.0

320

1283836132

0

http://9.186.64.113:8080/mashuphub/client

application/atom+xml

4) Http method: GET

5) 和别的resource 的关系。

在representation 中用

定义了“MyCo Customer List”和“MyCo Customer List with weather info”的关系

总结一下,一个设计良好的RESTful web 服务应该包括一下几个定义:

l1) 服务描述文档,如清单15 所示;

l2) 资源(resource) 及其identification;

l3) 资源的representation 的定义

l4) 用HTTP method 表示的资源的manipulation

l5) 在资源的representation 里面以Hyperlink 表述的资源和资源之间的关系

回页首

结束语

REST 是一种架构风格,汲取了WWW 的成功经验:无状态,以资源为中心,充分利用HTTP 协议和URI 协议,提供统一的接口定义,使得它作为一种设计Web 服务的方法而变得流行。在某种意义上,通过强调URI 和HTTP 等早期Internet 标准,REST 是对大型应用程序服务器时代之前的Web 方式的回归。

本文根据Roy 的论文,结合实际的例子,重新解析了REST 中的核心概念。根据作者多年的创建和使用RESTful web 服务的经验,更多的是在观念上的澄清。最后通过一个RESTful web 服务,告诉读者一个真正意义上的RESTful web 服务是什么样子。但愿本文的讨论会您提供了一定意义上的思想上的指导和实践上的指导。

参考资料

学习

l Roy Fielding 论文“Architectural Styles and the Design of Network-based Software Architectures”描述了一个框架来使用架构样式理解软件架构,并演示了如何使用样式指导基于网络的应用程序软件的架构设计。

l构建RESTful Web 服务介绍如何使用Restlet(一个面向Java?应用程序的轻量级框架)构建

RESTful 应用程序。

l编写REST 服务介绍了REST 和Atom 发布协议(Atom Publishing Protocol,APP)的概念,展示了其在服务中的应用。

l ATOM: ATOM specification.

l RSS RSS specification.

l ATOM Publishing Protocol: APP 协议标准。

l深入浅出REST对REST(Web 架构)背后的概念提供快速的介绍。

l RESTful Web Services描述了如何利用可编程应用程序的Web 功能。

l Implementing RESTful Web services in Java介绍如何编写遵从JAX-RS: Java API for RESTful Web Services (JSR-311) 规范的RESTful web 服务。

l RESTful Web Services描述了如何利用可编程应用程序的Web 功能。

讨论

l My developerWorks 中文社区

REST Service 的最佳实践,第2 部分: REST service 化一个数据系统

马春娥, 软件工程师, IBM

简介: REST 服务最佳实践系列的第一篇,通过对几种Web 服务的架构进行示例对比以及深入的REST 架构的解析,读者已经认识到RESTful Web 服务的优势。本文作为REST Service 最佳实践系列的第二篇,来解决很多程序员特别关心的问题,就是怎么把一个已有的业务数据系统REST 服务化,以最大化企业的投资。本文站在最终使用REST Service 的角度,以Mashup 为例,分析一个领域内的REST 服务的分类,然后讲解具体REST 化一个特定的领域的方法,包括识别一个领域内的基本的资源的方法,怎么描述资源之间的关系,怎么找到一个领域里面每种REST 服务的实例,并且以一个具体的应用系统为例,讲解这些方法论的实际运用。

查看本系列更多内容

标记本文!

发布日期: 2011 年 2 月28 日

级别:中级

引言

在Web 变成可编程的platform 的进程中,有一些应运而生的新的服务的应用场景。我们来看一个具体的例子。Lily 是Web 2.0 team 一个Web 开发人员,她想买一些Web 2.0 开发相关的书来开阔和加深她对Web 2.0 技术的理解。她希望怎么做呢?她打开她订阅的eBay畅销书服务(一个Feed),看到目前最畅销的一组关于Web 2.0 的书籍,在她浏览这些书的介绍的时候,她还想看看这些书在Amazon上的书评。等她决定好了买哪些书的时候,她想最好能货比三家,她要知道各个书商提供的书的价格比较,她选择了一家性价比比较合理的书商后需要付钱购买,比如用Goolge Check Out来付账。服务之间的导航关系如图 1 所示。图 1. 买书所需用的的服务以及关系

今天,lily 如果想做到这一点,要么IT developer 帮她专门开发一个集成的系统,把这些不同vendor 提供的Web 服务集成起来:eBay 提供的畅销书服务,Amazon 提供的书评服务,https://www.sodocs.net/doc/334573509.html, 提供的书的价格比较服务,Google 提供的Goolge Check Out服务。但显然这种方法实施性和适应性都较差,因为lily

的需求不固定,浏览的路径也不固定,IT developer 很难决定需要集成哪些Web 服务,很难满足像lily 这样的不固定的需求。另外,Lily 还可以选择使用现有的Mashups 的产品,如IBM Mashup Center,但是她需要做比较枯燥乏味而又不是那么容易的widget 之间的wiring,而且她还要自己知道这些个相关的Web 服务。对lily 而言,如果有这样一个系统,她可以从最开始的eBay 畅销书服务开始浏览,然后查看Amazon 的书评,就像现在的Web 上面的HTML 页面之间通过hyperlink 浏览一样,她也可以很容易的通过鼠标的点击、选择、输入一些很少的东西再辅以搜索就可以从一个服务达到另一个服务,平滑、自然、简单、轻松。

这是一个美好的梦想,如何能实现这个梦想?作为第一步,每个企业或者业务系统都必须服务化,实现数据的灵活访问,也就是企业信息系统的解锁,让普通人以Web 的方式就能轻松的访问。基于此,我们分析lily 买书这个场景中的几个Web 服务可知,这些Web 服务虽然来自不同的系统,但他们之间是有联系的。eBay 提供的畅销书服务的数据里面包含书的ISBN 信息,而Amazon 的书评服务和https://www.sodocs.net/doc/334573509.html, 提供的书的价格比较服务都需要ISBN 信息才能返回相应的书的书评和价格比较。另外如果现在很多人都用Goolge Check Out 付账,说明他的popularity 比较高。当用户想要购买的时候,可以用它。如果我们要满足lily 的要求而又不需要IT developer 的参与,我们就需要一种方式描述和建立服务之间的关联,发现和利用这种关联来改善普通人们使用互联网的体验–像使用HTML 为基础的内容Web 一样来自由地从一个服务浏览到另外一个服务,这正是REST 架构风格可以解决的问题。

回页首

传统的Web 业务系统的分析

在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。Martin Fowler 在《Patterns of Enterprise Application Architecture 》一书中,将整个架构分为三个主要的层:表示层、领域层和数据源层,如图 2 所示。

表示层(User Interface Layer) 位于最上层,离用户最近,为用户提供一种交互式操作的界面,用于显示数据和接收用户输入的数据。

业务逻辑层(Business Logic Layer)是系统架构中体现核心价值的部分。它的关注点主要集中在业务规则的制定、业务流程的实现等与业务需求有关的系统设计,也即是说它是与系统所应对的领域(Domain)逻辑有关,很多时候,也将业务逻辑层称为领域层。业务逻辑层在体系架构中的位置很关键,它处于数据访问层与表示层中间,起到了数据交换中承上启下的作用。

数据访问层(Data Access Layer)有时候也称为是持久层,其功能主要是负责数据库的访问,直接操作数据库,针对数据的增、删、改、查。简单的说法就是实现对数据表的Select,Insert,Update,Delete 的操作。如果要加入ORM 的元素,那么就会包括对象和数据表之间的mapping,以及对象实体的持久化。

分层的结构给Web 应用的开发带来了很多好处,比如开发人员可以只关注整个结构中的其中某一层;可以很容易的用新的实现来替换原有层次的实现;可以降低层与层之间的依赖;有利于标准化;利于各层逻辑的复用。现在也是作为Web 应用的主流架构提供。

图 2. Web 应用的三层架构

回页首

企业信息系统面临的挑战

尽管企业现在有很多的数据系统和应用系统,但是还仍然面临以下的严峻挑战:

1.现有的应用系统的“更新”速度跟不上“变化”的速度。也就是说,IT 的更新速度跟不上业务需求的

变化速度。

2.通常业务人员的数据需求是非常宽泛和任意的,IT 系统很难用一个固定的逻辑写出一个固定的系统来

满足。现实生活中的需求是多种多样的,一个用固定逻辑写出来的系统只能满足一部分的需求,不够灵活。

3.通常业务人员请求的数据可能来自很多其他的领域,比如在公安领域,警察办案除了警察自己的数据

库以外,还需要交通部门的数据,中国移动的数据,等这些数据都不是写几个SQL 语句就能拿到的。这个挑战设计到不同系统之间的集成。怎么样把各个系统的资产变得可重用,还能以一种简单的标准的协议互相通信。

4.数据拿到之后对数据还需要做一定的随机的处理,比如合并、过滤、排序等,现有的固定逻辑的业务

系统也很难满足。

回页首

以更灵活的Mashup 的视角看业务系统

Mashup 和现有的Web 应用系统

Mashup 是Web 2.0 领域里面一个特别火的词,wikipedia 上的解释是“网络聚合应用,由一个或者多个信息源整合起来的网站或者网络应用”。从企业的角度看Mashup,应该理解成更“灵活的数据的使用和更简单的应用的构建”。图 3 是一个“客户360 度信息”的Mashup。可以看出,在这个Mashup 中包含五个服务,分别是:①以表格形式展示的客户的基本信息;②以曲线形式展示的沃尔玛的股票信息;③以时间线形式展示的沃尔玛的购买行为;④以柱状图形式展示的客户季度收入情况;⑤以feed 阅读器形式展示的沃尔玛的新闻。可以看出,这个Mashup 里面包含的服务来自好几个数据源:①客户的基本信息来自企业的CRM 系统;②股票信息来自google 财经;③客户的购买行为来自企业的采购系统;④客户季度销售额来自google 财经;⑤新闻来自google news。

图 3. 一个“客户360 度信息”的Mashup

从上面的例子我们可以看出Mashup 和现有的Web 应用系统相比的优势:

1.一线的业务人员通过“自服务”的方式创建应用。由此,一线业务人员可以“快速响应、快速决策、

通过增强的协作”来应对快速发生的问题和变化。和传统的IT 系统相比,这种让业务人员通过“自服务”的方式构建应用的能力使得IT 系统的成本大大降低,并且还增强了系统的灵活性。

2.动态组装和配置的应用满足了企业随需应变的需求。

3.快速的、动态的创建日常工作中的情景式应用。这些情景式应用一般要求“good enough”就可以,通

常都没有long run 的需求。所以“快速的构建、快速的迭代”的能力对这种应用来说比较重要。

4.很容易的把来自不同数据源的信息“混合”在一起形成新的洞察力。通过解锁个人桌面系统和企业信

息系统的数据源,发布成可供搜索的、可消费的、可被组装的Feeds,然后在需要的时候把这些数据“混合”在一起,组成新的数据或者应用。

Mashup 和传统系统集成技术

Mashup 是Web 2.0 领域里面一个特别火的词,wikipedia 上的解释是“网络聚合应用,有一个或者多个信息源整合起来的网站或者网络应用”。从企业的角度看Mashup,应该理解成“更灵活的数据的使用和更简单的应用的构建”。那很多人要问了:从这个角度讲,Mashup 和传统的BPM、BI、EII、ESB 类似的集成技术有啥不一样呢?我们来分别看一看。

1.Mashup 和业务流程管理系统(BPM)。BPM 是以流程(Process)的系统集成方式,通常需要人的参

与。它通常以流程的形式解决长期的、稳定的、企业至关重要的业务。Mashup 不试图去解决这类问题,它主要以灵活组装Web 服务的形式解决数据的灵活使用、定制化的应用的开发、随机的瞬态的业务目标。通常有浏览器端的可视化工具,使得人们可以自助式的创建这样的灵活的情境式应用。2.Mashup 和业务职能系统(BI)。BI 是一种传统的发挥数据价值的一种手段。基于数据仓库(data

warehouse)。Mashup 不需要依托于数据仓库,它的基本单元就是Web 服务,widget,gadget。Web 服务提供数据,widget 和gadget 提供数据的展示。很多的BI 服务像OLAP analysis、reporting、data mining 等都可以以Web 服务的形式作为Mashup 的源数据。另外Mashup 也可以为BI 的服务提供高质量的前端的展示,像现在Cognos 和Mashup 的结合就是一个很好的例子,解决了传统BI 的数据可用性问题。

3.Mashup 和企业信息集成系统(EII)。传统的EII 是信息集成的过程,通过数据抽象(一系列的结构

和命名约定),提供企业范围内的数据的统一的接口和视图。EII 的目标是使得企业里面大量的异构的数据能够以统一的同构视图提供出来。和BI 一样,EII 也可以为Mashup 提供很重要的数据源。

4.Mashup 和企业服务总线(ESB)。ESB 是SOA 里面架构师们特别喜欢采用的手段。ESB 更多的关注

应用之间的交互,而Mashup 是由最终用户创建的,只是针对当前用户的业务场景而生成的一个近似实时的应用。Mashup 可以为ESB 提供输入,ESB 里面跑的服务也可以被Mashup 消费。

相对于这些传统的企业集成技术,Mashup 是一种扩展和补充。Mashup 提供更灵活的数据使用和展示,主要关注情景式的、瞬态的应用,就像在引言部分lily 买书的例子一样。传统的这些集成系统也可以以Web 服务的形式为Mashup 提供强大的企业数据源。

Mashup 的解决方案

前面两个小节分析了Mashup 和现有Web 应用系统以及传统信息集成集成的优缺点,这节主要讲述以Mashup 技术为基础的解决方案。在业务人员能够创建Mashup 应用之前,需要把信息和服务发布成为可以Mashup 的格式,通常而言就是Feeds 或者Widgets。

1.服务化已有的系统。包括数据层,逻辑层,展示层。数据层和逻辑层以Feeds 的形式提供出来,展示

层以widgets 的形式展示出来。

2.创建Mashup 的前端可视化工具。该工具提供简单拖拽、配置就能快速的构建Mashup。

图 4. 基于Mashup 的解决方案概念图

回页首

最佳实践—REST 服务化现有系统

RESTify 数据层

这一节主要讲述识别、创建和发布数据服务的方法。

识别数据服务

识别数据服务是最关键的一步,主要解决针对一个数据系统,应该提供哪些数据服务。根据该系列的第一篇文章“REST Service 的最佳实践第一部分:重新解析REST Service”,读者已经知道,RESTful Web 服务的核心是以“资源”为中心,而这里实体- 关系图中的“实体”和“资源”在语义上有很大的关联性,所以这里提供一个基于E-R(Entity-Relationship)模型的识别数据服务的方法论。实体- 关系图是一个在数据库设计时帮助架构师进行思考的重要的概念图,反映出信息系统的实体以及实体和实体间的关系,因此实体-关系图一个很好的手段去发现曝露出去的资源。图 5 是一个在线购物网站的E-R 图,我们将以此为例,讲述识别服务的方法。

图 5. 一个在线购物网站的实体- 关系图

识别数据服务的步骤如下:

1.把实体- 关系图中的“实体”发布成数据服务

如图 5 中所以,黄色的方框表示的是“实体”。本质上,这些“实体”对应的是系统的“资源”,可以看出,一个在线购物网站,需要提供的资源包括:买家、卖家、供货商、商品、订单、账单、快递单、购物车、买家评价、分类。

2.把实体- 关系图中的“关系”发布成数据服务

实体- 关系图中定义的“实体”之间的“关系”为“一对一”、“一对多”、“多对多”的关系。把实体- 关系图中的“关系”发布成数据服务,这里所说的“关系”不是实体之间的数量对应关系,而是语义上数据依赖、相似关系。实体之间的语义关系有几种,如图 6 所示。

图 6. 实体之间的语义关系图

下面分别来阐述图 6 所示的关系对应的数据服务。

相同属性

“相同属性”指的是“实体 A 和 B 有相同属性”。在“在线购物”的这个场景中,由“相同属性”

找出来的数据服务可能包括:具有相同“收获地址”的订单;具有相同“风格”的商品,具有相同属性“打折商品”的商品,等等。一个应用场景是:当用户浏览一件T 恤的时候,假如“T 恤”这个实体的属性有:风格、面料、尺寸、品牌这四个属性,我们可以识别出来跟实体“T 恤”相同属性的数据服务有两类:一类是相同实体类型的,如相同“风格”的“T 恤”,相同“面料”的“T 恤,相同“尺寸”的“T 恤”,相同“面料”的“T 恤”;还有不同实体的具有“相同属性”的数据服务包括:相同“风格”的“裤子”,相同“面料”的“裤子”,相同“尺寸”的“裤子”,相同“面料”

的“裤子”等等。

从技术来讲,“相同属性”这种识别出来的数据服务其实就是给在1)中识别出来的实体创建了很多不同的查询条件。通过“属性”,把数据服务关联了起来。通过本系统的第一篇文章,读者已经知道了REST 的一个核心思想是创建相互联系的服务,而“相同属性”识别数据服务的方法,一方面我们可以得到很多数据服务,另一方面,这些数据服务天然的就相互联系在一块,和REST 的核心思想一致。

从用户的角度来讲,“相同属性”是一种导航的线索,通过“相同属性”的关系识别出来的数据服务,使得人们获得一种灵活查询数据的能力。

操作

“操作”关系是指“实体 A 对实体 B 做了什么操作”。比如在“在线购物”的这个场景中,“买家”是一种类型的实体,“商品”是另一种类型的实体,“买家 A ‘购买’了商品B”就是“操作”关系的一种实例。

通过“操作”关系,可以定义的数据服务包括:买家 A 购买的商品列表,买家 A 浏览的商品列表,买家 A 评价的商品列表等等。

和通过“相同属性”识别的数据服务类似,通过“操作”关系识别出来的数据服务也天然的符合REST 的约束。

实体 A 的实例和实体 B 有相同的关系

“实体 A 的实例和实体 B 有相同的关系”指的是同种类型的实体的不同实例和第二种类型的实体有相同的关系。还是拿“在线购物”为例,买家A“购买”了商品C,买家 B 也“购买”了商品C,那么可以提供一个数据服务为“同时购买商品C”的买家列表。细心的读者已经发现,这种关系和“相同属性”的关系有相似之处,不同点在于“相同属性”的关系不依赖于第二种实体,而这种关系依赖于外来的实体,识别数据服务的规则是一样。

和前两种通过“关系”识别出来的数据服务一样,通过“实体 A 的实例和实体 B 有相同的关系”的关系识别出来的数据服务也天然的符合REST 的约束。

3.把实体- 关系图中隐含的“实体”发布成数据服务

通过前两种通过“实体”和“关系”的方法,我们已经得到了很多RESTful 的数据服务,但这并没有把所有的数据服务都找到,还有一类隐含的数据服务。在“在线购物”的场景中,“买家”(一种实体- 关系图中的实体)可以对“商品”(一种实体- 关系图中的实体)进行“评价”(一种实体- 关系图中的关系),过程中产生了一个隐含的实体“评价内容”。

也就是说,在实体- 关系图中的“关系”,除了像CRUD(创建、查看、更新、删除)这些直接作用在另一个实体的关系以外,还有像“评价”、“打分”等关系,这些关系会产生一些新的实体。我们需要分析实体- 关系图中的关系,识别出这些隐含的数据服务。

立邦刷新服务常见问答

立邦刷新服务常见问答 1、什么是立邦刷新服务? 答:立邦刷新服务是立邦公司为消费者提供的涂料施工服务,目前主要提供的是针对旧房墙面进行翻新涂刷的服务。 2、如何申请此服务? 答:直接拨打立邦全国咨询热线400-885-1687,北京地区客户可以拨打立邦漆北京指定施工商服务热线400-101-1687. 3、刷新服务都会做什么?(流程或步骤) 答:我们不仅提供施工服务,同时还为您提供上门定制施工方案、家具搬移、遮蔽保护、归位清洁等全程一站式服务。为您免去涂刷过程中的麻烦,让你省心放心。 4、涂料是我们自己购买吗? 答:我们的服务报价中会根据您的需求确定具体的涂料产品,。客户可以到立邦漆专卖店购买或者由立邦刷新服务施工人员带上门。 5、立邦刷新服务有什么质量保证? 答:在产品上,我们选择了对旧墙面具有针对性的净味产品,能保证环保;在施工上,负责施工的师傅全部都是经立邦认证的油工师傅,有多年的油漆施工经验。我们承诺涂刷之后您会得到一年的保修,如果有任何问题您都可以随时联系我们。 6、施工需要多长时间?周末可以施工吗? 答:施工的时间是上午9点--下午5点,周末也可以施工。具体的时间长度要根据装修的面积和墙面问题而定,通常会在3至5天。我们的宗旨是在尽可能短的时间内完成施工,将对主家生活的影响降到最低程度。 7、装修期间可以住在房子里面吗? 答:可以。我们涂料全部使用净味产品,达到环保要求,涂刷期间可以居住。不过施工期间可能会引起您生活上的不便,但我们会尽可能的将这种干扰降低到最小。 8、立邦刷新服务是怎么收费的? 答:我们的收费按照涂料和施工费分开报价,涂料部分的费用是根据您涂刷的

三大刷漆陷阱案例全剖析刷漆首选立邦刷新服务

三大刷漆陷阱案例全剖析,刷漆首选立邦刷新服务天气渐暖,家装行业也逐步进入旺季,各路刷漆队伍出现在业主面前,让不少准备新居装修的业主挑花了眼,但你是否知道,家居装修还有一个别称--“遗憾工程”。立邦刷新服务统计了三大刷漆陷阱案例,望大家谨慎。 典型陷阱:报低预算单,通过施工增项变相加价 张氏夫妇买了新房,经过反复对比,两人选择了一家报价相对便宜的施工队伍。可一开工,夫妇俩却发现,工程实际用料远高于预算单,油漆多了一成,而这些用料都需额外埋单,让夫妇俩大呼上当。 专家建议:仔细查看装修项目是否已全部纳入预算,签订合同时图纸跟预算要一致,必要时可在合同的预算清单中约定:“设计方案微调的情况下,允许实际用料与预算有5%的偏差,超过该范围拒绝付款。” 典型陷阱:与材料商勾结,抬高材料价格拿回扣 小罗准备装修,签单公司告诉他,公司可以代购材料,不仅质量好,还可拿到批发价。可之后,小罗却发现,设计师推荐的有些材料竟比商场还要贵。 专家支招:有些为拿回扣,以“方便客户而代购材料”的幌子,与经销商串通一气抬高价格。 典型陷阱:隐蔽工程偷工减料,房主多付冤枉钱

俞先生签订装修合同时,注明墙面油漆得用品牌漆。但实际施工中,原本420元的底漆被调包成了120元一桶的面漆。这种漆作底漆,既不防碱,又不防潮。完工入住后,俞先生家的墙面很快就起泡、剥落。此外,橱柜、衣柜等木制品与墙体交接面也因没做防潮处理开始发黑。 专家支招:对于细节和隐蔽工程,业主在签订合同中要明确工艺处理要求,并现场监管。有条件的可聘请第三方监理,完工后请专业人士验收,莫让装修公司既当裁判又当运动员。 专家强烈推荐:刷漆一定要找立邦刷新服务! 一:什么是立邦刷新服务? 立邦刷新服务是立邦公司为消费者提供的涂料施工服务,目前主要提供的是针对旧房墙面进行翻新涂刷的服务。 二:立邦刷新服务都会做什么? 立邦刷新服务为您上门免费定制施工方案、家具搬移、遮蔽保护、归位清洁等全程一站式服务。为您免去涂刷过程中的麻烦,让你省心放心。 三:立邦刷新服务有什么质量保证? 在产品上,立邦刷新服务选择了对旧墙面具有针对性的立邦漆净味产品,能保证环保;在施工上,负责施工的师傅全部都是经立邦认证的油漆工师傅,有多年的油漆施工经验。立邦刷新服务承诺涂刷之后您会得到一年的保修,如果有任何问题您都可以随时联系我们。

四种色彩为您诠释立邦刷新服务怎么样

四种色彩为您诠释立邦刷新服务怎么样导语:随着生活水平的提高,有很多朋友都萌生了对家庭进行重装修的想法,其中有很大一部分都选择了立邦刷新,但是也有一些顾客对立邦刷新服务心存疑虑。其实,这种担心大可不必,立邦刷新服务,安全方便,为您的爱家换一种颜色,换一种更舒适的生活。 时下,为了给生活营造一种全新的氛围,也为了让生活更加的舒适,很多朋友有产生了对家庭装修进行翻新的想法。这个时候,大家最先想到的往往就是立邦了。那么,立邦刷新服务怎么样?好不好?这就成为大家关注和讨论的话题了。大家都知道,在立邦刷新服务中有一句口号叫做,为爱上色。事实上,在立邦的服务过程中的确是这样的,为爱上色,用全新的色彩为广大客户营造一个崭新的家,营造一份温暖与舒适。 红色服务 在生活中我们把红色视为热情的象征,在立邦的文化中,我们把它的服务和红色联系起来,红色服务足以说明了它服务的热情。用过立邦的朋友都知道,要想对家庭进行刷新服务,只需要一个简单的电话,立邦就会在最短的时间内派专业的工作人员上门提供服务。通常情况下,工作人员至少会提供三次上门服务,一次是用来为顾客定制施工方案,报价,第二次是来签合同,确认施工面积等,第三次就是施工了。在施工方案的制定上,立邦会派最专业的人员上门服务,贴心为顾客考虑,拿出的施工方案绝对是优质、经济且高效的,这一点顾客绝对可以放心。 绿色材料 现在生活水平提高了,大家比以前更加的关注自己的健康和环保问题了,那么,在刷新的过程中,顾客最关心的话题莫过于环保问题了。特别是一些有老人或者是小孩的家庭,更是把环保问题当成头等大事来抓。这也是情理之中的事情,材料的选择直接关系着家庭成员的健康问题,更关系着一家人的幸福生活,千瓦马虎不得。在一点上立邦做的很好,立邦墙面全装体系,采用的都是绿色环保的材料,无毒无味,全程都不使用胶水,将环保进行到底。 金色品质 如果说立邦的服务是红色热情的,立邦的材料是绿色环保的,那么它的品质绝对是金色

立邦刷新服务价格表,让你轻松了解花的每一分钱

立邦刷新服务价格表,让你轻松了解花的每一分钱在计划翻新家居时,很多人会考虑找专业的涂刷公司来翻新。而在挑选涂刷公司时,先要考虑的是涂刷公司的翻新技术,其次就是价格。现在有很多涂刷公司没有固定的价格表,还没看到户主家的实际情况就直接报价,不规划涂料用量导致大量的涂料浪费,造成户主的损失。纵观涂刷市场,立邦刷新服务有别于其他涂刷公司,立邦刷新服务价格表详细列出每一笔钱款的用途,没有一点隐性消费,让消费者放心。 立邦刷新服务价格表包含了立邦刷新服务的服务范畴、服务项目内容清单以及各个服务的价格,总的来说分为两部分:材料费和人工费。 材料费指涂刷过程中用到的涂料和辅料费用。立邦刷新服务在施工时全部使用立邦涂料,立邦的涂料大致分为四种:用于内墙的内墙乳胶漆,用于外墙的外墙乳胶漆,用于木制家具翻新的木器漆和能刷出壁纸效果的艺术漆。这四种涂料的价格是不一样的,具体使用哪一种涂料要看户主的个人需求。 由于墙面具体情况不同,所使用的涂刷工艺也是不同的。一般来说,立邦刷新服务的人工费分为三个档次。墙面基层完好,可以直接涂刷施工的是一档;墙面有细小裂缝的,需要修补的是二档;如果基层松动,有发霉等情况,就需要铲除全部腻子石膏,重新刮两遍腻子石膏,然后再涂刷,这种情况是三档。每一种档次的人工费都是不同的,同时人工费还与需要涂刷的墙面面积大小有关,需要根据实际情况报价。 立邦刷新服务价格表所涉及的方面就是这些了。在签订合同后,立邦刷新服务不会再随意收取任何费用,施工完毕后才会收取尾款。立邦刷新服务除了拥有固定的价格表,提供的涂刷服务也非常的完善和专业,全程不用自己动手,一条龙服务让消费者可以省心、放心和安心。

搞定问题墙面 从一个立邦刷新服务电话开始

搞定问题墙面,从一个立邦刷新服务电话开始随着时代的发展,现在一个手机就可以搞定人们生活中大部分的事情。想吃饭,通过掌上外卖平台就可以快速吃到想吃的东西;手机没话费了,通过手机就可以充值;想买衣服/日常用品了,通过手机某宝就可以轻松入手;想为家进行一次刷新服务,通过手机拨打立邦刷新服务电话就可轻松预约专业人员免费上门服务。真诚的服务,从一个立邦刷新服务电话开始。 家住广州的蒋先生一直想为家里的客厅刷新一下,每天看着一成不变墙面,心里很不舒服。但是由于工作原因,一拖再拖一直没有时间实施。这次趁着十一长假就想把这事给办了,因为时间很紧迫,蒋先生找了好几家公司都说来不及。蒋先生心想这次计划又要泡汤了,后来偶然间在朋友的介绍下,蒋先生找到了立邦刷新服务。他一开始抱着试试看的心态打了立邦刷新服务电话进行了咨询。没想到的是,从打电话到上门检测、报价、设计方案、施工总共用来不到5天的时间。蒋先生为立邦刷新服务的办事效率感到惊奇,并感慨的说,十一假期不仅帮我解决了困惑已久的大事,还让我有闲暇时间去周边小玩了一下呢! 蒋先生回忆道:我是在9月底的时候拨打立邦刷新服务电话预约的,客服人员说隔天就可以上门来检测,由于工作原因,我就想在十一的7天长假内搞定,我预约了第一天放假的时间来上门检测。一大早立邦刷新服务人员准时来到了家里,进家门就开始直奔主题,开始针对我之前在电话里说明的情况对我家客厅进行检测,师傅带了十多样专业齐全的工具。检测完成后,根据实际情况他们就为我提供了一个刷新方案。通过协商确认了一些细节问题之后,就签订了刷新合同。 由于立邦刷新服务人员知道我时间紧迫,上午签完合同下午就搬工具来施工了。因为立邦刷新服务有专业的遮蔽保护膜保护家具,在施工期间家里的所有东西都不用搬离,他们用遮蔽保护膜把家里的沙发、灯具全都遮蔽好,甚至连开关、插座这些小物件也一个不落。由于之前没有和立邦刷新服务合作过,所以在施工期间我全程在家监工,但第一次让我觉得整个施工过程我监工是多余的,无论是遮蔽家具设施还是搬移家具,他们都很细致而且很小心,从不会弄出大动静,就和保护自己家的东西一样。整个施工过程居然只花了5天时间,而

立邦刷新服务,专业化的定制服务流程

立邦刷新服务,专业化的定制服务流程作为专业化的墙面刷新服务?品牌,立邦刷新服务一向以出色的服务、良好的态度、完善的体系在行业内颇负盛名。当家中墙面出现问题时,或者需要对家中的墙面进行翻新时,都可以选择立邦刷新服务来进行专业化的定制服务,让墙面服务的每一步都足够安心。 在家中墙面出现问题需要进行刷新的时候,可以通过拨打立邦刷新服务的服务电话进行相关的检测预约,客服会结合用户所在城市的情况进行相关问题解答。 预约成功后,立邦刷新服务专业的工作人员会免费到家中进行墙面检测,通过立邦刷新服务专业的检测仪为用户的施工方案提供较为准确的数据支持,与用户沟通确认后签订服务合同,全方位保障用户的权益。 值得一提的是,立邦刷新服务的专业服务人员在进行家中的墙面翻新时,会提供搬移家具的服务,不需要用户亲自动手。同时,立邦刷新服务的专业人士还会保护家具,避免受碰撞而损坏,并防止家具沾染灰尘,为用户带去更好的体验。

在墙面的处理环节中,立邦刷新服务的专业人士会采用打磨跑车的工具来进行墙面的打磨工作,先进的工具与刷新质量能够保持施工现场的清洁,同时也能让用户更快的住进新家。立邦刷新服务的专业人士都经过了立邦统一化培训,具备敬业的工作精神与良好的工作态度,不会在工作场所内喧哗、吸烟、随地乱扔垃圾。在施工完毕后,他们会主动清理现场,带走无用垃圾,方便用户后期清洁。 此外,立邦刷新服务采用验收满意后结算尾款这一人性化的服务模式保障了用户的权益。在施工完毕后,用户还会获得一张电子质保卡,可与用户的微信绑定,方便用户进行质保查询以及申请售后服务。

凭借专业化服务起家的立邦刷新服务在墙面施工过程中会做到细心、专心、耐心,为用户解决施工过程中可能出现的墙面问题,同时合理的收费标准也让立邦刷新服务更受用户的信赖。有关施工的具体价格可以根据实际情况前往立邦刷新服务的官网进行查看与咨询。选择立邦刷新服务,一站式为你解决墙面问题。

亲身经历立邦 刷新服务

亲身经历立邦刷新服务?,为立邦疯狂打电话! 今年过年期间跟男朋友回了老家,全程围观了立邦刷新服务?,太厉害了,疯狂为立邦打电话! 男朋友家房子很老旧了,一楼的墙面遇到下雨潮湿天气就上潮,长霉菌。所以墙面早已发黄发黑,二楼也还有很多墙面都脱落了。于是,他父母就联系了在电视上看到的立邦品牌,想要对房屋进行刷新。但对于立邦刷新服务?我们都不是很了解,所以在立邦官网和其他论坛上看了一些案例和帖子。综合其他品牌对比发现立邦刷新服务?很符合我们的需求,便毅然决然地选择了立邦刷新服务?。 在拨通立邦刷新服务?电话后,工作人员很快就到了,开始免费检测房屋情况,并针对男朋友家的房子制定了详细的刷新方案,签完合同就开始了刷新。 原来立邦刷新服务?真的全程都不用自己动手,我跟男朋友还有他的家人全程都是围观的状态,大概一个星期的施工周期我们完全不需要操心。 而且立邦刷新服务?不仅使用的材料好,从底到面没有一滴胶水,而且刷新的工具都非常专业,比如打磨墙面时,他们是用打磨法拉利跑车的打磨机来进行的无尘打磨,不仅粉尘少,效果也非常好。 除了材料好之外,立邦施工前后的服务也非常周到。工人施工前会用遮蔽薄膜保护屋内设施,连门把手、插座都不放过。施工后还把所有的建筑垃圾都带走了,并清理打扫了施工现场。而我们真的就是几个吃瓜群众,只需围观就可以了。 立邦刷新服务?通过电话和网络都能快速预约,而且施工速度快,产品质量好,服务也到位,墙面刷新前后感觉完全是两个房子。最重要的是施工过程中完全不用我们动手,省心又省力!年前短短一周就轻轻松松地搞定了房子,新年很多亲戚来拜年还都以为进错了门。虽然仅仅改变了墙面,却感觉整个房子都完全不一样了!

立邦刷新服务之阳台大改造

立邦刷新服务之阳台大改造 从去年开始,我一直想要翻新一下阳台,把这个丑到爆的阳台重新打造一个小清新的阳台多肉大军。但忙于工作的我一直拖着,一次偶然的机会跟朋友说起后都推荐我找立邦刷新服务来翻新,说既省心又省力,不用自己动手几天就可以搞定了,我想不用自己操心而且又是大品牌,应该比较靠谱,就抱着试试看的心理就搜了立邦刷新服务的官网,和在线客服详细咨询了一番后,就预约了他们的免费上门服务,先让专家来看下阳台的问题。 按照预约的时间,立邦刷新服务的师傅准时上门了,首先他们给阳台墙面做了个基础检测,并测量好面积。就阳台的具体问题,我们讨论了施工方案,方案沟通好之后,师傅们就开始动手啦~ 正式施工前,立邦刷新服务的师傅先做好保护工作,把家里大大小小的物件都用专业的遮蔽膜完全的保护起来,同时怕搬运材料把楼道弄脏,师傅们从楼下的过道一直铺到楼上,楼梯扶手边边角角也要通通做好保护,特别的细心。保护工作完成,就开始正式施工了,首

先他们把墙上的仿真砖壁纸全部铲除掉,然后再进行墙面基础处理,铲除原来的墙皮,刷一层绿色的防水,再加固、找平,边边角角都不放过,用打磨法拉利跑车的打磨机来打磨,墙面更平整光滑且施工无粉尘飞扬。 因为我希望打造一个多肉大军的小清新阳台,所以立邦刷新的师傅就建议我们选择不同色度的黄色立邦漆涂刷出一片沙漠,配合绿植多肉,营造出沙漠与绿洲的感觉。立邦漆都采用了净味技术,健康环保无添加,安全又靓丽。新的阳台很快就出来啦~效果堪称完美,来看一下阳台改造的前后对比照吧。

看到变身后的阳台,我都惊呆了,发誓以后一定好好照顾这些多肉。看到这么漂亮的阳台,瞬间幸福感爆棚。整个翻新过程立邦刷新服务仅仅花了3天时间,而且全都不用我自己动手,真是和朋友说的一样省心省力,真后悔没早点找到立邦刷新服务,白白拖了那么长时间,现在我没事就到阳台捣腾那些植物,感觉生活都变得更加丰富了呢~~~

立邦刷新服务价格表,收费标准全知道

立邦刷新服务价格表,收费标准全知道墙面刷新服务市场鱼龙混杂,很多品牌在未了解清楚具体的墙面问题时,就会胡乱给出报价,并且在施工过程中出现涂料浪费和未按约定使用涂料产品的情况,给消费者造成一定的损失的同时也无法保证刷新工作的质量。立邦刷新服务作为一个颇有名气的良心企业,拥有一套正规的收费价格表,让消费者能够对整个刷新服务中的每一笔支出都了然于胸。 立邦刷新服务的价格由人工费和材料费两部分组成,其中材料费是指涂刷过程中用到的涂料和辅料费用。立邦刷新服务在涂刷过程中所使用的立邦专有涂刷体系,具体产品的选择由业主自己来决定,根据业主的选择不同,价格也会不同。而人工费则是根据墙面具体情况和涂刷工艺的难度而进行具体分析,每一笔费用都有足够的依据,不会随意要价。并且在用户预约之后上门进行的墙面深度检测是完全免费的,后续会以此为依据制定方案并给出报价,待在业主了解和同意之后,才会与业主签订合同,充分保障了业主的权益。 在立邦刷新服务在整个过程中,全程不需用户动手,只需放心交给立邦刷新服务的工作人员,他们不仅会在刷新之前做好家具的搬移和保护工作,防止家具受到损伤或者沾染到灰

尘,而且还会严格按照要求进行墙面的涂刷,保证墙面刷新工作的质量。业主甚至无需进行现场监管,通过微信早晚报能够及时地了解到施工进度和涂料等产品的使用情况,保证不会偷工减料,让业主蒙受损失。 并且在施工完毕之后,立邦刷新服务的服务人员会进行清扫工作,还原业主一个干净的家。待业主验收成果并表示满意之后,才会收取尾款,保证业主在付出自己金钱的时候能得到令自己满意的墙面。 立邦刷新服务为了让业主从一开始就能够清楚地了解立邦刷新服务的价格表,开通了电话和网上预约服务,以供有意向的业主能够进行咨询和解疑,进而决定是否选择立邦刷新服务,让业主可以进行充分的考虑和选择,十分具有人性化。

立邦刷新服务:不用自己动手的一站式翻新服务

立邦刷新服务:不用自己动手的一站式翻新服务90后女孩小语独居在s市,有一套自己的房子。小语在工作上很有成就,但在生活上小语是一个不太会打理的人,对于家里的一些生活问题她都无法解决。最近她发现家里天花板渗水、墙壁发霉很严重,可是她对这些状况根本一筹莫展。于是她向好朋友诉说了自己的烦恼,朋友听后就推荐她找立邦刷新服务来翻新一下墙面,立邦刷新服务有空气卫士全层涂装体系,既专业又环保,而且立邦刷新服务全程不用自己动手,对于工作繁忙的小语来说很适合,不用自己跑市场买材料,也不用待在家里“监工”,全程一条龙全部搞定。 小语听从朋友的建议预约了立邦刷新服务,第二天立邦刷新服务的施工人员就到了小语家。他们配备齐全,进门后立邦刷新服务的施工人员就针对墙面进行了全面检测,根据实际问题为小语制定了一份专属的涂刷方案,施工人员说,立邦刷新服务采用的涂装体系,从涂料到配套辅料都不含一滴胶水,同时采用了立邦净味技术,可以有效的净化甲醛。 小语觉得立邦刷新服务的施工人员很专业,安排得也很周到,就爽快地签订了合约。立邦刷新服务的施工人员随即开始做着涂刷前的准备工作。他们将家具搬移至屋子的中间来腾出空间方便施工,同时拿出塑料膜,将大大小小的家具都严密地包裹起来,防止他们被涂料污染。这期间完全没有要小语动手。 整个施工期间由于小语要上班没有在家,晚上下班的时候,她就看见立邦刷新服务的施工人员在微信群里汇报翻新进度,施工的李队长说,基本上3天时间就可以完工了。施工完成后,屋子里渗水发霉的墙面没有了,整个屋子都明亮了很多。立邦刷新服务的施工人员还给了小语一张质保卡,让小语不仅享受着当下的服务,售后也有了保障。 小语对这次翻新感到非常满意,短短三天都让屋子变了个样,而且完全不用她操心,全程不用自己动手,轻轻松松就可以彻底解决墙面的各种问题。

立邦刷新服务之墙面翻新案例分享

立邦刷新服务之墙面翻新案例分享 墙面处理一直是房屋翻新中极其重要的环节,也容易出现棘手的难题,让众多业主束手无策。今天,小编就以立邦刷新服务给业主孙先生家做墙面翻新的过程为例,看看在房屋墙面处理过程中容易产生的问题和解决方法,帮助大家在翻新时能更加得心应手。 业主孙先生家是五年前装修的,没过多久墙面就出现了开裂情况。开始是一些小缝,孙先生也没太放在心上,可随后情况越来越严重,甚至天花板上都掉了好大一块。孙先生本想重新涂漆,可孩子还小,就只能暂时忍受。现在问题更加严重了,不能再一拖再拖。 立邦刷新服务的师傅上门给孙先生家做了墙面基检后说,孙先生家这样的情况,是典型的涂刷前没有做好基底处理。如果做基底处理不好,就会造成墙面不平整。情况好点,涂料刷上去会产生色差,颜色越深越容易发现;糟糕一点,就是出现破裂,甚至大面积脱落了。 立邦刷新服务的师傅根据孙先生家的墙面情况制定了对应的施工方案,并提供施工报价单,经孙先生确认无误后,他们决定第二天过来正式施工。 第二天上午,立邦刷新服务团队带着各种材料和工具来到孙先生家,先把家具搬移,里里外外都铺上遮盖膜,大到门、转角柜、吊灯、空调,小到开关、门把手、踢脚线每个地方都不放过。

然后开始正式施工。先处理基层,把旧的腻子全部铲掉,铲到水泥层。然后加固墙面,加固剂能渗透墙体深处,提升基层强度。同时,也可封固表面浮灰,有效预防基层疏松造成的墙面开裂、空鼓问题。接着重新刮腻子,一定要披刮均匀,然后用无尘打磨机进行墙面打磨,不仅平整而且没有尘土飞扬。最后涂上底漆和面漆,墙面立马焕然一新。不仅如此,立邦刷新?的空气卫士全层涂装体系还保证了施工环境,安全又环保,翻新后的房子没有异味,给孙先生家提供了绿色健康的家居生活环境。施工结束,立邦刷新服务的师傅们又帮孙先生把家具归位,并清理施工现场。最终效果就出来了~ 针对孙先生这样的情况,小编要提醒大家注意,在涂刷墙面之前,一定要注意墙面腻子

立邦刷新服务价格收费全解析

立邦刷新服务价格收费全解析 近年来,立邦刷新服务在房屋翻新市场脱颖而出,立邦刷新服务是由立邦公司为消费者提供的涂料施工服务,服务内容包括解决墙面问题、翻新墙面颜色。立邦刷新服务自推出以来,以其专业周到的服务赢得了消费者的认可,在涂装市场中脱颖而出,这也让更多人想知道,立邦刷新服务价格怎么样?立邦刷新服务价格值不值? 立邦刷新服务价格构成包含了材料费和人工费。其中材料是指翻新所用的涂料、辅料以及各种工具。立邦的涂料分为内墙乳胶漆、外墙乳胶漆、艺术漆和木器漆四种,每种的价格都是不一样的。而人工费则取决于所要翻新面积的大小以及墙体施工类型,看具体情况而定。 关于立邦刷新服务价格,一般是在施工人员制定翻新方案时一并报价的。当立邦刷新服务的施工人员接到预约后,会在第二天到达户主家,给户主做免费的墙面检测,并测量墙面面积,为施工方案提供准确的依据。接着施工人员会根据户主家的墙面状况制定专属的施工方案,并就价格问题进行交流,达成共识后,施工人员会与户主签订合同,保障户主的权益。 签订合同之后就开始正式施工了。立邦刷新服务的施工人员会帮户主搬移家具、保护家具,避免家具被磕碰及沾染灰尘,不用户主动手,让户主省心。在打磨墙面时,立邦刷新服务使用打磨法拉利跑车的工具来打磨墙面。专业的机器打磨速度快效果好,打磨机器可将作业中产生的粉尘吸收,减少环境污染,确保户主和施工人员的健康。

所有墙面涂刷完成后,家具归位和现场清洁工作仍然是由立邦刷新服务的施工人员完成,不用户主动手。在户主验收完所有施工项目后,施工人员才会收取尾款。施工完成后,户主还享有一年的免费质保服务,只要在立邦刷新服务的微信公众号,绑定我的订单,就能随时查看质保卡信息了。 不管是立邦刷新服务价格还是其涂刷服务,处处诠释着专业与周到,无怪乎立邦刷新服务能够在涂刷市场中脱颖而出,赢得了广大消费者的喜爱!

相关主题