API REST,当GET限制违反语义时

时间:2018-09-12 20:31:16

标签: rest api http

构建API REST时,应使用GET请求完成数据查询。这是教科书。但是GET限制为低至数千个字符的范围,而POST则没有这种限制(通常只有几个MB)。

那么,如何处理超过GET限制的请求(想想您有一个API并发送一个邮政编码数组,以返回名称数组)?

在这种特殊情况下,由于数组超出GET限制,我使用POST。可以,但是有些人会认为这是可耻的。
所以我想知道解决这个问题的规则是什么。
出于明显的性能原因,无法请求n次唯一的邮政编码。

1 个答案:

答案 0 :(得分:0)

REST只是我们每天都在使用的Web的概括。您基本上可以在REST环境中应用与Web相同的技术。即如果存在大量可用选项或自由文本输入,它们很容易超过2k个字符,则可以使用POST执行调用并通过有效负载发送数据,也可以重新设计方法。前一种方法缺乏对safeidempotent之类有价值的属性的支持,并且可能根本避免缓存。

另一种方法是对客户端可以作为自己的资源发送的选择进行建模。这允许某些配置被“命名”,重用并通过简单的GET请求调用。在HTML中,客户端可以请求所有可用的配置,然后选择适合其需要的配置,或者要求服务器提供一个表单页面以输入选择,然后通过POST将其发送到服务器。稍后,此配置将出现在将来的客户端对可用配置的请求中。

指向该特定资源的URI的实际结构通常对于客户端而言并不重要,因为应该使用有意义的(链接关系)名称来确定要调用的URI。可以通过GET轻松地调用这些资源,application/vnd.form-hal+json自动提供上述属性。这里的关键部分是找到一种对客户端有意义的命名方案,以便客户端了解此URI实际上有什么用。

将表单转换为REST体系结构可能也不是最简单的事情。在HTML中,规范已经包含了形式,选择以及链接的语义。您可以重用该特定功能,也可以使用自己的媒体类型,即{{1}},它可以是HAL-JSON的扩展,它已经定义了链接的结构。这种媒体类型特别告诉接收者这种有效载荷,以这种表示形式接收的数据旨在以表格形式表示或表示表格数据,因此可能包含用于显示或存储的用户输入。

因此,找不到任何当前查询配置合适的客户端可能会询问服务器如何创建新配置。服务器将使用上述表示的有效载荷通知客户端,如果客户端理解,则表示该负载将导致客户端以有意义的方式向其用户显示数据,甚至允许客户端采用该表示并填写所需的表示信息本身,并通过POST发送回服务器,以创建新的查询配置。然后,对可用配置的进一步要求也应列出新的配置。

正如您希望看到的那样,

Web中使用的相同技术也可以应用于REST。这样的方法可以很好地扩展,并且在实践中非常强大,因为服务器会教客户端如何发送请求,并且客户端不需要有关该服务的任何先验信息。该技术还可以解释Fielding在他的blog posts中要求的内容:

  

REST API 几乎应将其全部描述性精力用于定义用于表示资源和驱动应用程序状态的媒体类型,或为该对象定义扩展的关系名称和/或启用超文本的标记现有的标准媒体类型。花费所有精力描述应该在媒体类型的处理规则范围内(并且在大多数情况下已由现有媒体类型定义)完全定义对感兴趣的URI使用哪种方法。 )。 [失败在这里表示带外信息正在驱动交互,而不是超文本。]