如果 GET URI 太长,我是否应该创建我的 GET REST 端点的 POST 版本?

Should I create a POST version of my GET REST endpoint in case the GET URI is too long?

我有一个 REST 端点 GET /api/rules。 filtering/querying 需要多个查询参数,例如 typenameownerdescriptiontag。所以你最终可能会得到这样的 URI:

GET /api/rules?name=rule1,rule2&owner=john,jane&description=VeryLongDescription

具体来说,我担心查询的描述可能很长,使 URI 太长(我忘记了限制)。我是否应该为从服务器获得 414 URI Too Long 响应的用户创建同一端点的 POST 版本?

我的意思是,一般来说,什么时候只制作一个获取资源的 POST 才有意义?任何时候引入查询参数?

理论上 URI 没有限制,但实际上它们可能会受到实现的限制。如果您必须规避实施强加的非协议固有的限制,您应该尝试将它们与您的应用程序分离。

如果您是纯粹主义者,通过 POST 方法支持功能的或多或少的标准方法是使用 x-http-method-override header,它可以与您的应用程序分离如果它是作为请求 pre-processor 实现的。您可以让预处理器将 POST 请求转换为您的应用程序期望的 GET 请求,将负载转换为查询字符串。

这是 Google 翻译 API 中此方法的示例:https://cloud.google.com/translate/v2/using_rest#Translate

如果您不是纯粹主义者,或者如果这对您的用户来说太复杂,或者您不想使用自定义 header,我认为制作 POST 没问题获取资源的端点,只要它被正确记录并且被查询的资源由 URI 标识。