复杂的搜索本身不是RESTful吗?

时间:2017-10-17 19:02:58

标签: rest

我正在编写(或尝试编写)RESTful Web服务。其中一个主要功能是允许客户端从我们的服务器搜索文件。这看起来像教科书GET场景,但搜索太复杂/灵活,无法在URL中输入。

相反,我接受通过XML对象的搜索参数。明显的问题是GETs aren't supposed to have request bodies。事实上,我使用的网络服务器只是忽略了它们,所以如果我愿意,我就不能忽视这种做法。

It seems then that POST is the next option,但这显然不是我所追求的。它将完成工作(它实际上是我现在正在使用的),但它显然不是正确的工作请求方法。我决不会创造新的资源;我实际上是从现有文件中复制字节并将其反馈给客户端。它并没有获得更多的GET。

我面临的问题是,对文件的请求只是有太多字段可以放入URL中(一些是可选的,一些是强制性的,一些是基于其他字段有条件强制的,依此类推...... 。),但我唯一的另一个选择是故意滥用REST的4个关键字之一。这些都不是非常RESTful。

是否存在请求可能变得过于复杂以至于无法维护纯REST方法,或者我没有正确接近这一点?我是否完全错过了标记,实际上是使用RPC而不是REST?

注意:我知道在这个主题上有一些类似的问题,但是它们似乎都没有正式的共识(主要是像#34;我使用POST的答案) ,但它非常hacky"),很多都来自几年前。我希望REST社区已经就如何处理这些问题达成了更大的协议,或者至少同意这不是一件RESTful事情。

1 个答案:

答案 0 :(得分:1)

  

复杂搜索本身不是RESTful吗?

没有

传统上,复杂搜索的协议使用表单来收集可配置的令牌以进行搜索。媒体类型的处理规则告诉客户端如何将令牌组合成可用于获取结果的新标识符。

  

这看起来像教科书GET场景,但搜索过于复杂/灵活,无法在网址中输入。

因此,如果您有太复杂的东西无法表示为标识符,那么表单处理也不会为您解决问题。

在HTTP中,适当的选择是使用POST。

  

这显然不是该作业的正确请求方法。我决不会创建新资源

这个工作的正确选择非常明确,因为POST的语义是

  

根据资源自身的特定语义处理请求中包含的表示。

为POST创建一个从属资源是一个 use ,但它并不是那么严格。换句话说,使用POST不是滥用,因为您使用POST符合HTTP的统一接口。

它在某些方面缺乏 - 查询通常既安全又幂等,POST不会宣传这些约束,这意味着通用客户端无法利用它们。如果你能够获得更好的东西,你就可以使用它......

您正在寻找的方法是SEARCH;这可能是完美的,除非没有被接受为标准。

假设您的路由框架具有灵活性,您可以将POST和SEARCH都公开为options,这将允许知道SEARCH的客户端在可用时使用该方法。

  

我面临的问题是对文件的请求只是有太多的字段可以放入URL中(一些是可选的,一些是强制性的,一些是基于其他字段有条件强制的,依此类推......)

你知道,对于一系列表单来说,这一点听起来都不是特别困难,所以你可能想重新考虑是否将这些信息编码到URI中太复杂了。

也就是说,开发REST api的一个共同出发点是从“我将如何使用网页”这一问题开始,然后从那里开始查看是否可以使网页机器可读。