RESTful编程到底是什么?


当前回答

本质上没有“RESTful编程”这样的概念。它最好被称为RESTful范式,甚至更好的RESTful架构。它不是一种编程语言。这是一个范例。

来自维基百科:

在计算中,表示状态转移(REST)是一种用于web开发的体系结构风格。

其他回答

什么是REST?REST代表代表性状态转移。(有时拼写为“ReST”。)它依赖于无状态的、可缓存的客户端服务器通信协议——实际上在所有情况下,都是HTTP使用协议。REST是一种用于设计网络应用程序的架构风格。其思想是,使用RPC或SOAP连接机器,使用简单的HTTP机器之间的呼叫。在许多方面,可以查看基于HTTP的万维网本身作为基于REST的架构。RESTful应用程序使用HTTP请求发布数据(创建和/或更新)、读取数据(例如,并删除数据。因此,REST对所有四个CRUD使用HTTP(创建/读取/更新/删除)操作。REST是RPC(远程过程调用)和Web服务(SOAP、WSDL等)看看REST有多简单。尽管REST很简单,但它功能齐全;基本上有在Web服务中,没有什么是RESTful无法完成的建筑学REST不是“标准”。永远不会有W3C例如REST推荐。尽管有REST编程框架,使用REST非常简单通常使用诸如Perl、Java或C#。

当我试图找到休息的简单真正含义时,我找到了最好的参考之一。

http://rest.elkstein.org/

我想说,理解REST的一个重要组成部分在于端点或映射,例如/customers/{id}/balance。

您可以将这样的端点想象为从网站(前端)到数据库/服务器(后端)的连接管道。使用它们,前端可以执行在应用程序中任何REST映射的相应方法中定义的后端操作。

这个答案是针对初学者的,让我们了解一下目前最常用的API架构。

了解Restful编程或Restful API。首先,您必须了解什么是API,在一个非常高级的API上,它代表应用程序编程接口,它基本上是一个软件,可以由另一个软件使用,以允许应用程序相互对话。

全球使用最广泛的API类型是web API,而每当有请求时,它都会向客户端发送数据。

事实上,API不仅用于发送数据,而且并不总是与web开发、javascript、python或任何编程语言或框架相关。

API中的应用程序实际上可以意味着许多不同的事情,只要软件的pice是相对独立的。以文件系统或HTTP模块为例,我们可以说它们是一小块软件,我们可以使用它们,我们可以通过使用它们的API与它们进行交互。例如,当我们对任何编程语言的文件系统模块使用read-file函数时,我们实际上使用的是file_system_reading API。或者,当我们在浏览器中进行DOM操作时,我们实际上并不是在使用JavaScript语言本身,而是在使用浏览器向我们公开的DOM API,因此它为我们提供了访问它的权限。或者,再举一个例子,让我们用Java等任何编程语言创建一个类,然后向其添加一些公共方法或财产,这些方法将成为从该类创建的每个对象的API,因为我们给其他软件提供了与我们的初始软件(在本例中为对象)交互的可能性。S0,API实际上具有比构建web API更广泛的含义。

现在让我们来看看构建API的REST体系结构。

REST(代表代表性状态转移)基本上是一种以逻辑方式构建web API的方式,使其易于为自己或他人使用。

要按照REST架构构建Restful API,我们只需要遵循几个原则。1.我们需要将API分成逻辑资源。2.然后应使用基于资源的URL公开这些资源。3.要对数据执行不同的操作,如读取、创建或删除数据,API应使用正确的HTTP方法,而不是URL。4.现在,我们实际发送回客户端或从客户端接收到的数据通常应该使用JSON数据格式,如果应用了某种格式标准。5.最后,EST API的另一个重要原则是它们必须是无状态的。

将API分离为逻辑资源:REST中信息的关键抽象是一种资源,因此,我们希望在API中共享的所有数据都应该划分为逻辑资源。什么是资源?好吧,在REST的上下文中,它是一个对象或某个事物的表示,它有一些与之相关的数据。例如,像导游、用户、地点或评论之类的应用程序就是逻辑资源的例子。因此,基本上任何可以命名的信息都可以是资源。不过,只需要命名,而不是动词。

暴露结构:现在我们需要暴露,这意味着使用一些结构化的URL来提供数据,客户端可以向其发送请求。例如,像这样的整个地址被称为URL。并且调用了这个/addNewTour和API端点。

我们的API将有许多不同的端点,如下所示

https://www.tourguide.com/addNewTour
https://www.tourguide.com/getTour
https://www.tourguide.com/updateTour
https://www.tourguide.com/deleteTour
https://www.tourguide.com/getRoursByUser
https://www.tourguide.com/deleteToursByUser

这些API中的每一个都会将不同的数据发送回客户端,并执行不同的操作。现在,这里的这些端点有一些非常错误的地方,因为它们确实没有遵循第三条规则,即我们应该只使用HTTP方法来对数据执行操作。因此,端点应该只包含我们的资源,而不是我们对其执行的操作,因为它们很快就会成为维护的噩梦。

我们应该如何在实践中使用这些HTTP方法?好了,让我们看看这些端点实际上应该是如何以/getTour开头的。所以这个getTour端点是为了获取关于一个旅游的数据,所以我们应该简单地命名这个端点/旅游,并在向这个端点发出get请求时发送数据。换句话说,当客户端使用GET HTTP方法访问端点时,

(我们只有端点或URL中的资源,没有动词,因为动词现在在HTTP方法中,对吗?通常的做法是总是使用复数形式的资源名称,这就是我写/tours或/tours的原因。)惯例是,当调用端点/游览时,将返回数据库中的所有游览,但如果我们只希望游览具有一个ID,比如说七个,我们会在另一个斜杠(/tours/7)或搜索查询(/tours?ID=7)中添加七个,当然,它也可以是游览的名称而不是ID。

HTTP方法:这里真正重要的是端点名称如何与所有端点名称完全相同。

GET: (for requesting data from the server.)

https://www.tourguide.com/tours/7
POST: (for sending data to the server.)
https://www.tourguide.com/tours
PUT/PATCH: (for updating requests for data to the server.) https://www.tourguide.com/tours/7
DELETE: (for deleting request for data to the server.)
https://www.tourguide.com/tours/7

PUT和PATCH之间的差异->通过使用PUT,客户端应该发送整个更新的对象,而使用PATCH,客户端应该只发送已更改的部分对象。

通过使用HTTP方法,用户可以执行基本的四个CRUD操作,CRUD代表创建、读取、更新和删除。

现在可能会出现如下情况:

因此,/getToursByUser可以简单地转换为/users/tours,对于第3号用户,终点将类似/users/3/tours。

如果我们想删除特定用户的特定游览,那么URL应该是/users/3/tours/7,这里是用户id:3和游览id:7。

因此,像这样整合资源的可能性真的很多。

以JSON形式发送数据:现在,关于客户端实际接收到的数据,或者服务器从客户端接收到的,我们通常使用JSON数据格式。典型的JSON可能如下所示:在发送JSON数据之前,我们通常会进行一些简单的响应格式化,这有几个标准,但其中一个非常简单的标准叫做Jsend。我们只需创建一个新对象,然后向其添加一条状态消息,以通知客户端请求是成功、失败还是错误。然后我们将原始数据放入一个名为data的新对象中。

像我们在这里所做的那样,将数据包装到一个额外的对象中称为包络,这是缓解一些安全问题和其他问题的常见做法。

Restful API应该始终是无状态的:最后,Restful API应该总是无状态的,这意味着,在无状态的Restful API中,所有状态都在客户端处理,而不是在服务器上。状态只是指应用程序中可能随时间变化的一段数据。例如,某个用户是登录的还是在一个包含多个页面的列表的页面上,当前页面是什么?现在,状态应该在客户端上处理这一事实意味着每个请求都必须包含在服务器上处理特定请求所需的所有信息。因此,为了处理当前请求,服务器永远不必记住以前的请求。

让我们假设目前我们在第五页,我们想前进到第六页。因此,我们可以有一个名为/tours/nextPage的简单端点,并向服务器提交一个请求,但服务器必须确定当前页面是什么,并根据该页面将下一个页面发送给客户端。换句话说,服务器必须记住先前的请求。这正是我们希望在RESTful API中避免的。

我们应该创建一个/tours/page端点,而不是这种情况并将数字6粘贴到其上,以请求第6页/游览/第6页。所以服务器不必记住其中的任何内容,它所要做的就是按照我们的要求发回第六页的数据。

无状态和无状态是计算机科学和一般应用中非常重要的概念

这是我对REST的基本概述。我试图演示RESTful架构中每个组件背后的思想,以便更直观地理解概念。希望这有助于为某些人揭开REST的神秘面纱!

REST(代表性状态转移)是一种设计架构,它概述了网络资源(即共享信息的节点)的设计和寻址方式。一般来说,RESTful体系结构使得客户端(请求机器)和服务器(响应机器)可以请求读取、写入和更新数据,而客户端不必知道服务器是如何操作的,并且服务器可以在不需要了解客户端的任何信息的情况下将数据传递回去。好吧,酷。。。但我们如何在实践中做到这一点?

最明显的要求是需要有某种通用语言,以便服务器可以告诉客户端它正在尝试如何处理请求,并让服务器做出响应。但是,要找到任何给定的资源,然后告诉客户该资源所在的位置,需要有一种指向资源的通用方法。这就是通用资源标识符(URI)的作用;它们基本上是查找资源的唯一地址。

但REST架构并没有就此结束!虽然以上内容满足了我们所需的基本需求,但我们也希望拥有一个支持高流量的体系结构,因为任何给定的服务器通常都会处理来自多个客户端的响应。因此,我们不想让服务器记住以前请求的信息,从而使服务器不堪重负。

因此,我们施加了一个限制,即客户端和服务器之间的每个请求-响应对都是独立的,这意味着服务器不必记住以前的请求(客户端-服务器交互的以前状态)来响应新请求。这意味着我们希望我们的交互是无状态的。为了进一步减轻我们的服务器因重做最近已为给定客户端完成的计算而承受的压力,REST还允许缓存。基本上,缓存意味着对提供给客户端的初始响应进行快照。如果客户端再次发出相同的请求,服务器可以向客户端提供快照,而不是重做创建初始响应所需的所有计算。但是,由于它是一个快照,如果快照尚未过期(服务器提前设置了过期时间),并且响应自初始缓存以来已更新(即请求将给出与缓存响应不同的答案),则客户端将不会看到更新,直到缓存过期(或缓存被清除),并且再次从头开始呈现响应。关于RESTful架构,最后一件事是它们是分层的。实际上,我们已经在讨论客户端和服务器之间的交互时隐式地讨论了这个需求。基本上,这意味着我们系统中的每个层只与相邻层交互。因此,在我们的讨论中,客户端层与服务器层交互(反之亦然),但可能有其他服务器层帮助主服务器处理客户端不直接通信的请求。相反,服务器根据需要传递请求。

现在,如果所有这些听起来都很熟悉,那就太好了。超文本传输协议(HTTP)定义了通过万维网的通信协议,它是RESTful架构抽象概念的一种实现(如果你像我一样是OOP狂热者,则是抽象REST类的实现)。在REST的这个实现中,客户端和服务器通过GET、POST、PUT、DELETE等进行交互,这些都是通用语言的一部分,可以使用URL指向资源。

老问题,新的回答方式。关于这个概念有很多误解。我总是努力记住:

结构化URL和Http方法/动词不是restful编程。JSON不是restful编程RESTful编程不适用于API

我将restful编程定义为

如果应用程序以客户端理解的媒体类型提供资源(是数据+状态转换控件的组合),则该应用程序是静止的

要成为一个安静的程序员,您必须尝试构建允许参与者做事的应用程序。不仅仅是公开数据库。

只有当客户端和服务器同意资源的媒体类型表示时,状态转换控制才有意义。否则,无法知道什么是控件,什么不是控件,以及如何执行控件。IE如果浏览器不知道html中的<form>标签,那么在浏览器中就没有什么可以提交到过渡状态。

我不想自我推销,但我在演讲中深入阐述了这些想法http://techblog.bodybuilding.com/2016/01/video-what-is-restful-200.html .

我演讲中的一段摘录是关于经常提到的richardson成熟度模型,我不相信这些级别,你要么是RESTful(级别3),要么不是,但我想指出的是,在你走向RESTful的过程中,每个级别都为你做了什么