让我们用一个简单的Web服务作为例子:一个用于查询用户详细信息的电话簿查询应用程序。我们所拥有的资源就是用户的ID。使用Web服务和SOAP,发出的请求应该是这样的:
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:body pb="http://www.acme.com/phonebook">
<pb:GetUserDetails>
<pb:UserID>12345</pb:UserID>
</pb:GetUserDetails>
</soap:Body>
</soap:Envelope>
(注意:不要关注细节,这只是一个例子)
上面的内容会通过HTTP的POST请求发送到服务器,而服务器返回的结果可能是一个XML文件,不过结果作为有效的数据内容,它会嵌入到一个SOAP请求封装中。
那么采用REST会是什么样呢?REST请求是这样的:
http://www.acme.com/phonebook/UserDetails/12345
注意看,REST请求并不是一个请求体,而只是一个url。此URL使用一个简单的HTTP GET请求发送到服务器,而HTTP回答就是结果的原始数据, 内部不会嵌入其他内容,就是你需要的、可以直接使用的数据。从上面的例子很容易看出,为什么Web服务通常要使用库来创建SOAP / HTTP请求,并将其发送,然后再解析SOAP响应,因为有封装格式在其中;
而对于REST,你所需要的就是一个简单的网络连接,你甚至可以使用您的浏览器直接测试的你的API;
尽管如此,REST库(一些简化你操作的东西)还是存在的,我们将在以后讨论其中的一些。
注意URL的“方法”部分,为何不叫“GetUserDetails”,而是简单地“的UserDetails”?这是一个REST设计中常见的约定,使用名词而不是动词来表示简单的资源。
这一节的比喻
对于REST与SOAP的一个很好的比喻是寄一封信:用SOAP,你需要使用一个信封;而用REST,你只需要一张明信片。明信片是比较容易被接受人处理的,也减少纸张浪费(在REST中意味这消耗更少的带宽),此外就是有一个简短的内容。(当然,REST请求不限制长度,尤其是如果他们使用的是POST,而不是GET)
但是不携带太多的比喻来讲(不同于信件和明信片),REST和SOAP一样的安全。特别是,当REST使用安全套接字(HTTPS协议)时,你可以试用任何你认为合适的机制加密你的内容。如果没有加密机制,REST和SOAP都是不安全的;;而如果采用适当的加密,两者都同样安全。