RESTful编程到底是什么?


当前回答

这个答案是针对初学者的,让我们了解一下目前最常用的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页。所以服务器不必记住其中的任何内容,它所要做的就是按照我们的要求发回第六页的数据。

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

其他回答

这就是它可能看起来的样子。

创建具有三个财产的用户:

POST /user
fname=John&lname=Doe&age=25

服务器响应:

200 OK
Location: /user/123

以后,您可以检索用户信息:

GET /user/123

服务器响应:

200 OK
<fname>John</fname><lname>Doe</lname><age>25</age>

要修改记录(姓名和年龄将保持不变):

PATCH /user/123
fname=Johnny

要更新记录(因此lname和age将为NULL):

PUT /user/123
fname=Johnny

剩下的一点是,如果我们同意对基本操作使用通用语言(http动词),那么可以配置基础结构来理解它们并适当地优化它们,例如,通过使用缓存头在所有级别实现缓存。

通过正确实现的restful GET操作,信息来自服务器的DB、服务器的memcache、CDN、代理的缓存、浏览器的缓存或浏览器的本地存储都无关紧要。可以使用最快、最容易获得的最新来源。

说Rest只是语法上的改变,从使用带有动作参数的GET请求到使用可用的http动词,这看起来没有任何好处,而且纯粹是修饰。重点是使用一种可以被链的每个部分理解和优化的语言。如果GET操作有副作用,则必须跳过所有HTTP缓存,否则结果将不一致。

一本关于REST的好书是《实践中的REST》。

必须读取代表性状态传输(REST),并且REST API必须是超文本驱动的

有关RESTful服务的解释,请参见Martin Fowlers的文章《Richardson成熟度模型》(RMM)。

要实现RESTful,服务需要实现作为应用程序状态引擎的超媒体。(HATEOAS),也就是说,它需要达到RMM中的3级,阅读文章以了解详细信息或qcon演讲中的幻灯片。

HATEOAS约束是首字母缩略词超级媒体的引擎应用程序状态。这一原则是REST之间的关键区别以及大多数其他形式的客户端服务器系统...RESTful应用程序的客户端需要只知道要访问的单个固定URL所有未来的行动都应该可从中动态发现超媒体链接包含在资源的表示从该URL返回。标准化媒体类型也是预期任何人都能理解可能使用RESTful API的客户端。(来自免费百科全书维基百科)

Web框架的REST Litmus测试是Web框架的类似成熟度测试。

接近纯REST:学会爱HATEOAS是一个很好的链接集合。

针对公共云的REST与SOAP讨论了REST使用的当前级别。

REST和版本控制讨论了可扩展性、版本控制、可演化性等。通过可修改性

Edit

阅读这里的自述文件,我希望你真的能得到REST。

https://github.com/lukepuplett/surfdude-csharp/blob/master/README.md

--

这些给出链接资源示例的答案很好,但只占一半。

所以,想象你正在设计一个网站。你写一个故事,

我希望能够通过邮政编码搜索地址,以便选择发货地址

然后,您将构建网站,让用户踏上旅程,并尝试在工作流中将页面链接在一起。

一个网站设计让他们进行地址查找,然后让他们将地址复制到剪贴板,然后返回到发货地址表单,这是不太有用的。

REST API使用我们在web上认为理所当然的模式进行机器-机器交互。

对邮政编码功能的搜索不应该是base/addresss/{postcode},并且会返回一个集合,即使每个地址都链接到一个完整的地址和一些编辑链接,因为这是一个死胡同;API使用者需要猜测如何使用该地址。

相反,该功能的动机应内置于其使用的流程中,以便旅程在开始时结束:

1 GET /orders/123/shipping

  200 OK { Current shipping details + link to parent + link to address picker }

2  -> GET /orders/123/shipping/addresspicker

      200 OK { Link and form for searching for a postcode }

3   -> GET /orders/123/shipping/addresspicker?postcode=tn11tl

       200 OK { List of addresses each with link to pick it }

4    -> POST /orders/123/shipping/addresspicker?postcode=tn11tl&pickNo=3

        200 OK { Current shipping details + link to parent + link to address picker }

这是一次用户旅程,最后您可以看到流量对订单的影响。

HTTP请求/响应严格来说不是REST的一部分,但我认为没有人见过非HTTP REST应用程序。

现在这些URL可以是任何一组字符,它们只是标识符,我把它们做得很漂亮,因为它们对人们来说很有意义。机器将使用rel来计算它们做什么,而不依赖于可读的href。

什么是API测试?

API测试利用编程向API发送调用并获得产量。它的测试将被测段视为一个黑盒子。API测试的目的是在将部件协调到应用程序之前确认部件的正确执行和错误处理。

休息API

REST:代表性状态转移。

这是测试人员执行请求和接收响应的功能安排。在REST API中,通过HTTP协议进行交互。REST还允许计算机之间通过网络相互通信。对于发送和接收消息,它涉及使用HTTP方法,并且不像Web服务那样需要严格的消息定义。REST消息通常接受XML或JavaScript对象符号(JSON)形式的表单。

4常用API方法:-

GET:–它提供对资源的只读访问。POST:–用于创建或更新新资源。PUT:–用于更新或替换现有资源或创建新资源。DELETE:–用于删除资源。

手动测试API的步骤:-

要手动使用API,我们可以使用基于浏览器的REST API插件。

安装POSTMAN(Chrome)/REST(Firefox)插件输入API URL选择REST方法选择内容标题输入请求JSON(POST)单击发送它将返回输出响应

自动化REST API的步骤