# Cowboy REST流程图

本章将通过许多不同的图来说明REST处理程序状态机。

请求可能遵循四个主要路径。一种方法 OPTIONS ;一种用于方法GET和HEAD;一种用于方法PUT,POST和PATCH;一种是方法DELETE。

所有路径均以“ Start ”图开头,除OPTIONS路径之外的所有路径均通过“ Content negotiation ”图,如果资源存在,则通过“ Conditional requests ”图。

红色方块表示另一张图。浅绿色方块表示响应。其他方块可能是回调,也可能是Cowboy本身的应答。如果未定义回调,则绿色箭头倾向于指示默认行为。

# Start

所有请求均从此处开始。

REST启动流程图

依次调用一系列回调以对服务,请求行和请求标头执行常规检查。

这些步骤中的任何一个都不会收到请求正文(如果有的话)。当满足所有条件时,仅在“ PUT,POST和PATCH方法”图的末尾对其进行处理。

known_methodsallowed_methods回调返回的方法列表。Cowboy然后检查请求方法是否在列表中,否则停止。

is_authorized回调可以用来检查对资源的访问被授权。认证也可以根据需要执行。拒绝授权后,回调的返回值必须包含适用于所请求资源的质询,该质询将通过www-authenticate标头发送回客户端。

当请求方法为OPTIONS时,此图后紧接着是“ OPTIONS方法”图,否则,紧随其后。

# OPTIONS 方法

此图仅适用于OPTIONS请求。

REST OPTIONS方法流程图

options回调可以用于添加关于资源的信息,如媒体类型或设置语言; 允许的方法;任何其他信息。也可以设置响应主体,尽管不应期望客户阅读它。

如果options未定义回调,则Cowboy将默认发送包含允许方法列表的响应。

# Content negotiation 内容协商

该图适用于OPTIONS以外的所有请求方法。在“Start”图完成后立即执行。

REST内容协商流程图

这些步骤的目的是确定要发送回客户端的适当表示形式。

该请求可以包含任何accept标头;接受语言标题;或accept-charset标头。如果存在,则Cowboy将解析标头,然后调用相应的回调以获取为此资源提供的内容类型,语言或字符集的列表。然后,它将根据请求自动选择最佳匹配。

如果未定义回调,则Cowboy将选择客户端喜欢的内容类型,语言或字符集。

content_types_provided还返回它接受所有的内容类型回调的名称。当满足所有条件时,仅在“ GET和HEAD方法”图的末尾调用此回调。

所选的内容类型,语言和字符集将作为元值保存在Req对象中。你应该如果你手动设置响应体(旁边的错误代码,例如)使用适当名额的代表。

在此图之后,紧随其后的是“ GET和HEAD方法”图,“ PUT,POST和PATCH方法”图或“ DELETE方法”图,具体取决于方法。

# GET和HEAD方法

此图仅适用于GET和HEAD请求。

有关该cond步骤的说明,请参见“ Conditional requests ”图。

REST GET / HEAD方法流程图

当资源存在并且条件步骤成功时,可以检索资源。

Cowboy通过首先获取有关表示形式的元数据,然后通过调用ProvideResource回调来准备响应。这是为您从返回的每种内容类型定义的回调content_types_provided。此回调返回将被发送回客户端的主体,如果必须对该主体进行流传输则很有趣。

当资源不存在时,Cowboy将确定该资源先前是否存在,如果存在,则是否将其移动到其他位置以将客户端重定向到新的URI。

moved_permanentlymoved_temporarily如果它其实移动回调必须返回资源的新位置。

# PUT,POST和PATCH方法

此图仅适用于PUT,POST和PATCH请求。

有关该cond步骤的说明,请参见“ Conditional requests ”图。

REST PUT / POST / PATCH方法流程图

资源存在时,首先执行条件步骤。成功后,方法为PUT,Cowboy将调用is_conflict回调。例如,可以通过锁定资源来防止潜在的竞争情况。

然后,这三种方法都达到了content_types_accepted我们将在几段中描述的步骤。

当资源不存在且方法为PUT时,Cowboy将检查冲突,然后继续执行content_types_accepted步骤。对于其他方法,Cowboy将确定该资源先前是否存在,如果存在,是否将其移动到其他位置。如果资源确实不存在,则方法为POST并调用allow_missing_postreturn true,那么Cowboy将继续执行该content_types_accepted步骤。否则,请求处理到此结束。

moved_permanentlymoved_temporarily如果它其实移动回调必须返回资源的新位置。

content_types_accepted返回时,就接受的内容类型的列表,而且还为他们每个人的回调的名称。Cowboy将选择适当的回调来处理请求正文并进行调用。

此回调可以返回三个不同的返回值之一。

如果在处理请求正文时发生错误,它必须返回false并且Cowboy将发送适当的错误响应。

如果该方法是POST,则您可能会返回true带有创建资源位置的URI。这对于编写集合处理程序特别有用。

否则,返回true以指示成功。Cowboy将根据是否已创建而不是修改资源以及响应中位置标头或正文的可用性来选择要发送的适当响应。

# DELETE 方法

该图仅适用于DELETE请求。

有关该cond步骤的说明,请参见“ Conditional requests ”图。

REST DELETE方法流程图

当资源存在并且条件步骤成功时,可以删除资源。

删除资源是一个两步过程。首先delete_resource执行回调。使用此回调删除资源。

因为可能会缓存资源,所以您还必须在系统中删除该资源的所有缓存表示。不过,此操作可能需要一段时间,因此您可能在操作完成之前返回。

然后Cowboy将调用该delete_completed回调。如果您知道资源已从系统(包括从缓存)中完全删除,则可以返回true。如果仍有任何疑问,请返回false。牛仔将true默认承担。

最后,Cowboy检查您是否设置了响应正文,并根据该正文发送适当的响应。

当资源不存在时,Cowboy将确定该资源先前是否存在,如果存在,则是否将其移动到其他位置以将客户端重定向到新的URI。

moved_permanentlymoved_temporarily如果它其实移动回调必须返回资源的新位置。

# 有条件的要求

该图适用于OPTIONS以外的所有请求方法。resource_exists资源存在时,将在回调之后立即执行。

REST条件请求流程图

当请求包含if-match头中的任何一个时,它就成为条件请求。if-unmodified-since标头;if-none-match标头;或if-modified-since标头。

如果条件失败,则请求将立即结束,而无需任何资源的检索或修改。

generate_etaglast_modified根据需要被调用。Cowboy只会调用一次,然后将结果缓存以备后用。

Last Updated: 3/18/2021, 1:20:30 PM