巨大过滤查询的RESTful方法

时间:2019-02-27 15:12:14

标签: json rest url filter

我正在设计和实现一个REST端点,用于检索和过滤大量数据。数据被构造为信号,并来自不同的数据源。过滤过程仅返回来自指定源的指定信号。来自两个不同来源的两个信号可能具有相同的名称,因此不能仅通过名称唯一地标识它们。

问题是,哪种方法最具扩展性和REST风格?

我考虑过的事情:

  1. 使用URL中的两个参数列表发出 GET 请求:信号名称列表及其相应的源( sources = src1,src1&signals = sig1,sig2 )。但是,这将导致查询字符串很长。

  2. 使用JSON正文发出 GET 请求,其中包含源名称作为键,信号名称作为矢量( {src1:[sig1,sig2]} < / em>)。但是,这会破坏RESTful的良好做法,因为 GET 请求不应包含正文。

  3. 发出带有正文2的 POST 请求。但是,我已经有一个 GET 端点来检索数据(但是不进行过滤),我需要使用相同的。我可以将请求更改为 POST ,但是使用 POST 检索数据并不适合。

其他限制:以后可能会添加新的源,因此我不能只使用源名称作为查询参数名称(而且,我已经是其他查询参数)了,但是我可以轻松地遍历JSON的键。也有一些不包含信号的信号源,因此我也应该包含它们(例如,如果客户端从一个信号源请求所有信号的话,也是一样)。最后,到目前为止,信号数据库包含大约30,000个信号,因此最坏的情况应该可以涵盖所有这些信号。

1 个答案:

答案 0 :(得分:0)

避免使用选项2,正如您已经指出的那样,这不是一个好主意。无论如何,很多API框架都不允许您这样做。

对于其他两个选项-我认为拥有非常长的URL并没有什么错,它看起来很丑陋,但至少您可以获得GET的所有好处(幂等,清晰,可添加书签)。尝试使它与该选项一起使用,并尽可能考虑一些解决方法。

但是,如果确实需要,最终不要太担心转移到POST。这是不理想的,有时您无法真正绕开约定。