定义新的HTTP方法:HTTP搜索

2021-04-17 07:09:20

HTTP搜索是一种新的HTTP方法,用于包括请求正文的安全请求。它仍然早期'不断发展,但它最近被作为IETF草案标准,它将在任何地方添加一些伟大的新工具。

这是什么意思,为什么我们需要一个新的HTTP方法,如何如何重新搜索工作?

要了解每个人的工作,它是如何记住在资源方面定义的HTTP的重要性。资源可能是文档或照片或特定客户或整个客户列表,它由URL识别的URL(例如example.com)或示例的所有客户身份标识。 COM /客户/ 123(一个特定的客户)。

GET请求询问服务器进行资源。这通常用于请求HTML页面,从API读取数据或加载图像。

这些旨在是'安全'请求,纯粹读取数据。他们应该改变服务器的状态,他们应该有副作用,所以它们可以在许多情况下缓存(这意味着许多客户端获取响应将来自缓存,而且永远不会击中真实的服务器)。

获取请求可以由其URL参数化,可能包含路径和/或查询参数,但它们可以' t有一个请求身体。它没有特别禁止它,但它被定义为完全毫无意义,并且许多现有的实现将忽略身体或完全拒绝请求,如果您尝试发送一个。

它们还可以使用接受,接受语言和接受编码标题来请求特定的内容类型,语言或编码('给我客户123作为XML,请'),并使用范围标题仅要求部分文件('给我前100个字节的视频24')。

POST请求将数据发送到服务器上的资源,并询问服务器处理该数据。这是一个非常通用的"做点什么"请求通常用于发布消息,创建新的资源(例如新客户)或触发某些输入的触发处理。

就像get请求一样,它们可以由URL和各种标题参数化,但它们也可以包含请求正文:服务器应该处理的数据。为了帮助服务器处理此项,请求还可以具有内容类型标题,指定正文中的数据类型(例如,应用/ JSON)。

当然,这些aren' t安全请求。它们可以更改服务器状态(按设计),也可能在其他地方具有副作用。因为那个,他们在几乎所有情况下都没有缓存。事实上,他们'重新缓存

PUT请求将数据发送到服务器上的资源,并询问服务器使用该数据创建或替换资源。这比帖子更具体:当POST用于任意操作时,PUT仅用于创建/更新状态以匹配请求的正文。

这些通常在API中使用,作为特异性创造的一种方式。更新数据上的操作(虽然可能用于触发对该数据的任意操作)。

就像帖子一样,这将包括请求身体,并可能影响服务器和#39; s状态(所以使缓存无效),但它可以' t有副作用。相反,请将请求必须是幂改量。这意味着如果您成功发送了两次完全相同的PUT请求,并且没有否则发生,那么一切都应该处于相同的状态,好像您只发送一次请求。

如果您考虑帖子/文档VS PUT / DEPORY,您可以看到差异。该POST请求通常意味着'创建一个新的文档',每次制作相同的请求时都会创建一个新文档。 PUT请求同时必须意味着'使用给定的数据创建或替换整个文档列表和#39;假设服务器允许的东西,反复发送请求将使文档与同一状态留下作为发送一次。

修补程序请求将数据发送到服务器上的资源,并询问服务器使用该数据部分更新资源。这可用于更新客户' s地址或附加到文本文档。

像Put&帖子,这将包括请求身体。它们'重复不安全的请求,它们'重复不幂等待(两次向文档附加相同的事情将改变何时文档)。

删除请求询问服务器删除资源。我认为这个'我认为很自我解释。

一个重要说明:就像Get一样,删除请求不能包含一个正文。它不会在删除数据时提供数据,服务器保留忽略或拒绝如果您完全拒绝的权利。

选项:请求有关如何制作其他请求的信息,主要用于浏览器中的CORS

跟踪:请求您的请求的回声,用于跟踪通过代理&amp的请求; CDNS(非常易于使用/支持)

所有这些都很棒,但现在没有一个重要的是,所以让'忽略它们。

所以:Get获取数据,POST执行任意不安全操作,PUT执行IDEMPOTENT全更新,修补程序执行部分更新,并删除删除。得到和删除aren' t允许一个身体,但所有其他人都是。

这些具有重要意义之间的差异。可耻性在许多大型应用中都是至关重要的,请求安全具有重要的UX含义,并且每个都有助于对API开发人员进行通信您的API如何工作。

在实践中,如果您明天将所有GET请求交换所有GET请求,它会在技术上工作,但只在可能的意义上。响应将停止可缓存,因此您的CDN将完全放弃,您的服务器将突发成火焰,因为流量增加了10,000%。浏览器将拒绝在页面历史记录或重试失败的页面加载中拒绝/转发,没有巨大的警告(因为它的不安全,并且可能具有副作用),没有其他人查看您的代码或请求将有任何想法到了你的地狱'重新尝试。

这些语义有助于许多工具和基础架构我们都使用它来了解HTTP请求的意思。使用正确的方法来实现正确的事情。

如果要做复杂的数据检索,请发送大量数据但未更改服务器状态怎么办?

使用Get,并挤压您在URL或标题中所需的所有参数

URL&标题通常具有任意的非标准长度限制,并为大值创建可怕的UX。您必须编码特殊字符和amp;纽丁,所以URL变得完全不可读,你可以' t指定一个内容类型,可以方便地解析。因为它'没有标准,很少有工具将为您做出这么容易,所以你'重新回到自己所有的询问和串联询问。你理应获得更好的。

同时,缓存是一个很大的交易,并且完全发布了无效。它和#39;它的根本基本上是错误的语义:这个请求不会改变任何州,它不会有任何副作用,并要求所有工具将其视为问题。

此外,您可能想要发送复杂查询的资源也是您可能想要发布数据的资源类型。如果帖子/客户创建新客户,如何为客户数据发布查询?有可能,但在同一资源上使用帖子,很快让您降低一个漫长而俗话的道路到坏软件。

搜索请求是' s safe(不改变目标资源)的请求。

这有助于搜索我们可以实现上面的实施方式:我们可以清楚地发送复杂的数据查询,而无需在URL中编码它们或使用POST请求。

请注意,这仍然只是标准草案。细节可能会改变,甚至名称是' t 100%修复(草案是正式命名的"安全方法与身体"而不是参考搜索,使得易于改变)。

把这一切都用一粒盐,但截至3月2021日,它现在正式采用了IETF HTTP草案规范,因此如果一切顺利,它就在最终标准化的官方路径上。

(不,你应该让远程客户端向您发送任意SQL查询,但您得到了想法)

现在,规范没有将此查询的结果定义为可缓存。它并不完全清楚为什么,但我怀疑这是因为今天的高速缓存永远不会考虑到身体,并开始这样做是一个需要一些仔细思考和咨询的重大变化。

也就是说,它确实避免了等效的POST请求的缓存失效。以上要求作为帖子需要每次缓存渠道删除它为/客户提供的任何缓存数据,强制要重新加载的所有数据。搜索没有,而且单独将是许多缓存设置的大升高。

请求主体明显可读且可管理 - 没有特殊的编码或长度限制

你现在可以自由地获得单独的语义,搜索和amp;在同一URL上发布

您可以使用它来支持您喜欢的任何语言的复杂查询,从GraphQL到SQL到OData。当然服务器需要了解您&#39的任何查询语言;重新使用,并且您应该在请求的内容类型标题中清楚地指示格式,以使可实现这一目标。

这对GraphQL特别有趣。 GraphQL目前将完全陷入上述陷阱,支持GET请求或发布请求,但在任何一种情况下都有尴尬的警告。搬到搜索只读GraphQL请求将显着提高UX,并且可以允许GraphQL更好地与将来缓存的内置HTTP功能集成。

像这样的查询语言是最明显的用例,但您也可以超越它:这支持任何发送身体的任何东西,以便在没有副作用的情况下从服务器请求数据。

rpc-style apis使用htth或其他apis don' t真实'查询'数据的数据也会从此受支持(尽管这确实会延长当前定义的语义)。例如,您可以发送数据并将服务器加密的API并将其返回给您。这并不是改变服务器上的任何东西,所以Post ISN' T适当,并获得与上述相同的限制。

您甚至可以使用此方法来支持与发布请求的干运行API(Don' T更改任何内容,但请告诉我如果我发布此数据会发生什么)。有很长的可能性列表!

除搜索外,规范还定义了接受搜索标题。可以在响应中使用,如此:

这允许服务器通告它接受搜索请求,并通过它将接受的查询的特定格式发出特定格式。这类似于现有的接受贴片标题。

服务器可以在任何响应中包括它,但它' s响应对选项请求的响应特别有用,客户端查询资源以询问支持哪些功能。

这是一个伟大的提案IMO的开始,但您需要了解它的事情,这在今天展台时创建了一些Gotchas和可能的改进。

本标准基于WebDAV的搜索方法(为文档创作&amp设计的HTTP扩展;在Web上版本控制)。

因为过去存在类似的方法,所以它确实意味着许多现有工具包括HTTP工具包本身和基础设施,如代理& CDN已经支持这一点,可以立即接受搜索请求而没有任何麻烦。

另一方面,在不破坏WebDAV的情况下添加到HTTP本身的搜索需要兼容性的一些思想。目前的解决方法在规范中是应用程序/ XML或Text / XML Content-Type标题的任何请求都必须遵循其查询正文中的WebDAV规范中定义的特定格式规则。

其他任何其他都不会是有效的WebDAV请求,因此可以自由地忽略这一点,但这确实为在XML API中搜索了一个真正的问题。它可能在将来的情况下,将放宽规范,仅在WebDAV和#39; s XML命名空间内应用此要求,但尚未正式指定。

虽然没有失效的缓存是一个很好的开端,搜索结果' t实际上很宽松。这不仅意味着它们'默认情况下没有可缓存:即使使用显式缓存标头,它们也不可缓存。

这是不幸的,因为它'与Get相比,并缓存查询结果是一个超级常用用例。

在这里,在这里持续的工作是在搜索可能变得可缓存的情况下准确指定,这将从本标准解锁更多的利益。我认为可能的结果是它默认赢得' t默认是可缓存的,但是给予适当的标题,但再次录制'尚未指定,所以让'等待'看。

搜索不是一个伟大的名字。并非每一个查询都是搜索,而且有各种各样的其他用途为"安全方法,身体"如上所述,完全超出简单查询数据集。

这已被识别出来,它被争论,并且还有其他提案(如查询或获取)。搜索确实具有一些兼容性优势,因为它在WebDAV中的现有用途,所以有一个挑战性的平衡。

更改名称将减缓所有现有软件中的采用,但可能使方法更清晰地了解和使用。 '不幸的是,这里没有容易答案。

就个人而言,尽管有这些警告,但我认为搜索本身就是有价值的,并且这里有很好的选择可以进一步迅速改善标准。

如果您' d进一步挖掘详细信息,可以通过IETF网站获得当前规范,您可以通过HTTP-Extensions Github连接IETF HTTP工作组邮件列表或打开问题/ PRS来获取。 repo(此规范的伞仓库加上其他一些潜在的HTTP添加)。分享您的想法并帮助塑造未来的HTTP!

如果您还有其他问题,或者有任何'遗漏了吗?随意取得联系,我喜欢听到它。

你用http工作吗?立即下载HTTP Toolkit签署&从浏览器,服务器,应用程序和其他任何地方进行Mock http。