使用 GET 管理复杂数据

Managing complex data with GET

我经常发现在不发送 JSON 正文的情况下很难管理复杂的 GET 请求。 URL 参数不会削减它。如果我设法找到使用 URL 参数的解决方法,那么通常会增加更多的复杂性和混乱。

我不是 Web 开发人员,我没有做过任何大型应用程序,但即使是小型应用程序,我也有这样的要求:

{ page: { batch: 10, current: 1 }
, sort: { _id: -1 } 
, project: {history: 0, attach: 0}
, filter: { status: "new"}
}

这是一个没有数组的简单请求。数组只会使问题更加严重。

那么,我的问题是您如何管理没有 JSON 正文的复杂 GET 请求?我 doing/thinking 哪里错了?为什么我们不能使用 GET 获取 body?

是的,我可能可以使用 URL 参数发送此请求,但这让生活变得更加困难,尤其是当您需要发送过滤器、寻呼等等时...

我厌倦了所有的困难,将此类GET请求更改为POST。 我知道这是错误的(因此出现了问题),但感觉就像卸下了我肩上的巨大负担。

我认为这两个 link 可以给你一些提示:

我认为这取决于您要在请求中处理的查询的复杂性。您可以将其与查询参数一起使用,但如果使用它们设计查询太复杂,您可以使用方法 POST 和描述它的内容。

您可以看看 OData 管理它的方式(尤其是查询参数 $filter$count$orderby$skip$top ).有关详细信息,请参阅此 link:http://docs.oasis-open.org/odata/odata/v4.0/csprd01/part2-url-conventions/odata-v4.0-csprd01-part2-url-conventions.html#_Toc355091894

希望对你有帮助, 蒂埃里

I got tired of all the difficulties and changed such GET requests to POST. I know it is wrong (hence the question) but it feels like huge load off my shoulders.

这根本不是真的。 POST 是执行 HTTP 未标准化的任何操作的方法。 GET 是检索标准化的,所以原则上你可以说使用 POST 来做你应该用 GET 做的事情是错误的,但是有一个问题......

绝对没有什么可以阻止您在 GET 请求上发送负载。 RFC 7231 表示 GET 有效负载没有定义的语义,因此只要您对其进行记录,就可以将其包含在内。由于没有标准语义,您必须为 API 生态系统确定一个统一的接口。然而,最大的问题是,尽管您的应用程序可以很好地处理 GET 有效负载,但您和您的客户端之间的许多 HTTP 实现可能不会。也许客户端或您的 HTTP 服务器会忽略它,或者缓存服务器不会缓存它,等等。

考虑到这一点,POST 也是用于规避损坏实现的方法。例如,许多 public API 有一个 X-HTTP-Method-Override header 允许您使用 POST 方法发出 PUT 或 PATCH 请求,指定实际方法在 header 中使用,以防中间的某些实现不理解 PUT 和 PATCH。

所以,在您的位置,我将简单地使用 POST 并记录我是如何使用它的,就像您已经做的那样;或者我会在 GET 请求上接受有效载荷,并允许客户端使用 POST 来发出带有有效载荷的请求,以防某些实现被破坏,为此设置覆盖 header。