2011-03-27 199 views

回答

30

REST是一种利用HTTP协议的方法,不是它的替代方法。

数据唯一地由URL引用的,并且可以在使用时的HTTP操作(GET,PUT,POST,删除等)起作用。消息/响应支持多种MIME类型,但XML和JSON最为常见。

例如,要读取关于客户的数据,您可以使用HTTP获取操作和URL http://www.example.com/customers/1。如果您想删除该客户,只需使用具有相同URL的HTTP删除操作即可。下面

的Java代码演示了如何使通过HTTP协议REST调用:

String uri = 
    "http://www.example.com/customers/1"; 
URL url = new URL(uri); 
HttpURLConnection connection = 
    (HttpURLConnection) url.openConnection(); 
connection.setRequestMethod("GET"); 
connection.setRequestProperty("Accept", "application/xml"); 

JAXBContext jc = JAXBContext.newInstance(Customer.class); 
InputStream xml = connection.getInputStream(); 
Customer customer = 
    (Customer) jc.createUnmarshaller().unmarshal(xml); 

connection.disconnect(); 

对于Java(JAX-RS)例如参见:

+0

更多的细节吗? – Adham 2011-03-27 12:00:05

+1

@adham - 我已经更新了我的答案和其他细节。 – 2011-03-27 12:12:26

+1

REST最重要的部分之一是使用超媒体以及它如何规定客户端状态。你的例子不显示这个。 – 2011-03-27 12:40:39

9

REST不是协议,它是用于描述无状态缓存客户端 - 服务器分布式媒体平台的通用体系结构。 REST架构可以使用多种不同的通信协议来实现,尽管HTTP是最常见的。

3

REST不是协议,它是暴露你的应用程序的一种方法,主要是通过HTTP完成的。

例如,要公开,它getClientById创建一个URL

yourapi.com/getClientById?id=4

而不是你的应用程序的API,你可以做
yourapi.com/客户/ ID/4

,因为你用的是GET方法,这意味着你想要得到的数据

您利用在HTTP方法:GET /删除/ PUT
yourapi.com/clients/id/4还可以处理删除,如果你发送的是删除方法而不是GET,意思是你要删除记录

+4

由于URIs不透明,因此yourapi.com/getClientById?id=4和yourapi.com/clients/id/4之间的REST术语没有区别。授予在前URI中使用动词“get”是一种难闻的气味,因为它表明他们可能认为GET可以做其他任何事情,但是/ clientById?id = 4与第二种情况一样安宁。 – 2011-03-27 13:27:57

+0

......或者就此而言,/ sadfhjsadfk/asfd/afsd/fsadfas如果这就是引用实体所说的那个客户端的URI。/sadfhjsadfk/asfd/afsd?fsadfas = 4虽然可以通过GET XForm或HTML表单或另一种机制获得,在这种机制中,URI的构造在文档本身中得到了详细描述(因此被视为超媒体,而不是基于*先验知识的URI格式)。 – 2011-03-27 15:04:47

33

REST是一种协议的设计风格,它是由开发者Roy Fielding在他的博士论文中对HTTP/1.0背后的方法进行了形式化,找到了适合它的方法,然后使用这种更加结构化的理解来影响HTTP/1.1的设计。因此,虽然它在很多方面都是事后的,但REST是HTTP背后的设计风格。

菲尔丁的论文可以在http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm找到,非常值得一读,也非常可读。博士论文可能相当困难,但这篇论文描述得非常好,对于我们这些没有计算机科学水平的人来说非常可读。它有助于REST本身非常简单;这是其他人提出后显而易见的事情之一。(对于这个问题,也包含了很多东西,老的Web开发人员以一种简单的风格学会了自己的努力方式,这使得它成为许多人的主要“哈哈”时刻)。

其他应用程序级别的协议以及HTTP也可以使用REST,但HTTP是一个典型示例。

由于HTTP使用REST,HTTP的所有用途都使用REST系统。将Web应用程序或服务描述为RESTful或非RESTful关系到它是利用REST还是反对它。

RESTful系统的典型例子是没有cookies“纯”网站(饼干并不总是柜台休息,但他们可以):客户端状态由用户点击它加载其他页面的链接改变,或者进行GET表单查询来获得结果。 POST表单查询可以更改服务器和客户端状态(服务器根据POST执行某些操作,然后发送描述新状态的超文本文档)。 URI描述资源,但描述它的实体(文档)可能根据用户偏好的内容类型或语言而有所不同。最后,浏览器始终可以通过PUT和DELETE更新页面,尽管这从来没有像现在这样常见,如果现在也不那么常见。

使用HTTP的非RESTful系统的经典示例是将HTTP视为传输协议,并且每个请求都将数据POST发送到同一个URI,然后在RPC-可能与连接本身具有共享状态。

REST风格的计算机可读的(即不是浏览器中的网站,但是以编程方式使用的东西)系统将通过GET URI获得有关资源的相关信息,然后返回一个文档(例如XML,但不一定)将描述资源的状态,包括相关资源的URI(因此是超媒体),通过描述新状态的PUTting实体或删除它们来更改它们的状态,并通过POSTing执行其他操作。

主要优点是:

可扩展性:缺乏共享状态使得一个更加可扩展的系统(证明了我大量的时候我删除从重重地砸网站都使用会话状态的,而我期待它给予一点额外的表现,即使是像我这样的长期反会议倡导者,也因为取消了会议中很少使用会议而获得的巨大收益而被吹走了,甚至不是为什么我一直在将它们删除! )

简单性:有几种不同的方式可以使REST比类似RPC的模型更简单,特别是只有少数几个“动词”是可能的,并且每种类型的资源ca n与其他人合理分开的理由。

轻量级实体:更多类似于RPC的模型倾向于最终在实体中发送大量数据,以反映类似RPC的模型。这不是必需的。的确,有时候一个简单的纯文本文件就是一个特定情况下真正需要的东西,在这种情况下,使用REST,这就是我们需要发送的东西(尽管这只是一个“最终结果”的情况,文字不链接到相关资源)。另一个经典的例子是获取图像文件的请求,类似RPC的模型通常必须以另一种格式包装它,并且可能以某种方式对其进行编码以使其位于父格式中(例如,如果类似RPC的模型使用XML ,该图像将需要base-64'd或类似以适合有效的XML)。 RESTful模型只会将文件传输到浏览器。

人类可读结果:不一定如此,但通常很容易构建一个RESTful Web服务,其结果相对容易阅读,这有助于调试和开发。我甚至建立了一个XSLT意味着整个事情可以被人类用作一个(相对粗糙)的网站,虽然它主要不是用于人类使用的(实质上,XSLT作为一个客户来展示它用户,它甚至没有在规范中,只是为了让我自己的开发更容易!)。

服务器和客户端之间的松散绑定:导致后续开发更容易,或者移动系统的托管方式。事实上,如果你遵守超文本模型,你可以改变整个结构,包括从单主机到不同服务的多主机,而不用改变客户端代码。高速缓存:对于客户端获取有关资源状态信息的GET操作,标准的HTTP高速缓存机制允许这样的语句:资源不会有意义地改变,直到最早的特定日期为止(不需要查询直到那时)或者它自从上次查询以来没有改变(发送说几百字节的头部而不是几千字节的数据)。性能的提高可能是巨大的(在某些情况下,足以将性能从不切实际的角度转移到性能不再受关注的程度)。工具包的可用性:因为它工作在一个相对简单的级别,如果你有一个web服务器,你可以构建一个RESTful系统的服务器,如果你有任何类型的HTTP客户端API(在浏览器javascript中的XHR,在.NET中的HttpWebRequest,等等),你可以构建一个RESTful系统的客户端。

应变:特别是,缺少共享状态意味着客户端可能会死亡并在服务器不知情的情况下重新使用,甚至服务器可能会死亡并在客户端不知情的情况下重新使用。很显然,在这段时间内的沟通将会失败,但是一旦服务器恢复在线状态,事情就可以继续。这也真正简化了网络农场的冗余和性能使用 - 每台服务器就像它是唯一的服务器一样,并且它实际上只处理来自给定客户端的一小部分请求并不重要。

+0

作者取消了链接到“舌头”的描述。 – 2015-04-18 21:44:48

-1

所有的答案都很好。

我在此添加的详细说明REST以及它如何使用HTTP

REST =表述性状态转移

REST是一套规则,随后当,使您能够构建有一组特定的理想约束的分布式应用程序。

它是无状态的,这意味着理想情况下客户端和服务器之间不应该保持连接。

客户端的责任是将其上下文传递给服务器,然后服务器可以存储此上下文以处理客户端的进一步请求。例如,由服务器维护的会话由客户端传递的会话标识符标识。无国籍

优点:

  1. Web服务可以将每个方法调用分开。
  2. Web服务不需要维护客户端以前的交互。
  3. 这反过来简化了应用程序设计。
  4. 与TCP不同,HTTP本身是一种无状态协议,因此RESTful Web服务可以与HTTP协议无缝协作。需要添加到每个请求保存客户端的状态在标题的形式

    1. 一个额外层:

    缺点无国籍。

  5. 为了安全起见,我们可能需要为每个请求添加一个标题信息。通过REST支持

HTTP方法:

GET:/string/someotherstring
据幂(指多次调用应该返回相同的结果每一次),每次最好应返回相同的结果呼叫制成

PUT:
和GET一样。幂等性,用于更新资源。

POST:应该包含一个url和body
用于创建资源。理想情况下,多次调用应返回不同的结果,并创建多个产品。

删除:
用于删除服务器上的资源。

HEAD:

HEAD方法是相同,除了在应答服务器不能返回一个消息体得到的。响应HEAD请求,HTTP头中包含的元信息应该与为响应GET请求而发送的信息相同。

选项:

此方法允许客户确定的选项和/或与资源相关联的要求,或者服务器的能力,但这并不意味着资源操作或者启动资源检索。

HTTP响应

Go here for all the responses

这里有几个重要的:
200 - OK
3XX - 从客户端和URL重定向
400需要更多的信息 - 错误请求
401 - 未授权访问
403 - 禁止
的请求有效,但服务器拒绝操作。用户可能没有资源所需的权限,或者可能需要某种帐户。

404 - Not Found
找不到请求的资源,但可能在将来可用。客户的后续请求是允许的。

405 - 不允许的方法 所请求的资源不支持请求方法;例如,需要通过POST呈现数据的表单上的GET请求,或只读资源上的PUT请求。

404 - 请求未发现
500 - 内部服务器故障
502 - 错误网关错误

+0

REST不是协议,不局限于XML和JSON。你描述的大多数是HTTP,而不是REST。 – EJP 2017-06-24 00:43:46

+0

@EJP是的。让我改变这条线。 – 2017-06-24 00:44:50

+0

您提供的大部分信息(以及更多)已经在文档中提供,因此我不确定这个答案是否真的增加了任何新的价值。 – 2017-06-24 00:55:19