【问题标题】:Passing array with key-value in and REST API following HAL在 HAL 之后传递带有键值和 REST API 的数组
【发布时间】:2014-11-25 09:43:03
【问题描述】:

我正在开发一个基于 HAL 规范的 REST API。 API 是用 PHP 和 Symfony 开发的,客户端是用 angularjs 构建的。 API 必须返回一些列表,它们将使用 ngtables library 显示,并且需要过滤选项,最好是 ngtables 使用的格式,例如 this sample

 { "name": "M", "age": "4" } 

(当然未来的客户可能会使用相同的选项。)

我的前端同事建议我将 json 编码直接作为 url 中的参数发送,如下所示:

?filter=%7B%20%22name%22%3A%20%22M%22%2C%20%22age%22%3A%20%224%22%20%7D%20

不过我不太确定。

我一直在阅读如何使用像 param[]=foo&param[]=bar 这样的参数通过 URL 发送数组,但这确实意味着多个值有一个键。在我的情况下,我需要能够像 Json 对象那样为数组发送不同的键值。

我想知道来自客户端的请求 URL 应该如何才能在一个参数中包含所有过滤器选项,以及是否有任何标准方法可以做到这一点。

已编辑:在@Ross_Turner 之后,我想澄清一下我在参数中传递键值数组的意图是因为我们将有另一种类型的参数。例如:

?filter=<my key-value array>&page=1&limit=50&anotherParam=whatever

即使我们想使用另一个包含另一个键值数组的参数,如下所示:

?filter=<my key-value array>&sorting=<another key-value array>&page=1&limit=50

filtersorting 可以有相同的键。

【问题讨论】:

    标签: angularjs api rest url


    【解决方案1】:

    目前没有在 GET 请求中发送查询的标准方法。因此,您有 2 个选择:使用自定义查询语言(就像您已经尝试过的那样)或选择标准查询语言。无论哪种方式都很难使其成为 RESTful,因为您必须创建一个链接,其中包含如何生成此类 URI 的方法。你或许可以使用URI templates,但有时它们不够通用……

    @罗斯·特纳:

    我想你误会了,我说的是没有标准。办公室。有非标准的基于查询字符串的解决方案,例如RQL。或者您可以在单个参数中发送标准 SPARQL 查询,但是没有标准的方式来描述这样的链接,并且没有链接描述,您无法在 REST 客户端中生成查询,因此它不会松散耦合,因此它将违反统一界面约束。

    【讨论】:

      【解决方案2】:

      我不同意@inf3ero 的回答——当然有一种非常明确的方式可以将查询作为GET 请求的一部分发送——查询参数。如果您想要不同的键和值组合,这是查询参数的键和值的主体,因此在您的示例中,您可能应该使用 ?name=M&amp;age=4 并在您的服务器上解析每一个。转换应该足够简单

      { "name": "M", "age": "4" } 
      

      通过遍历 JSON 对象中的键来实现。如果您尝试按照 HAL 规范实现 RESTful API,我不确定为什么要将这些组合成一个参数。

      【讨论】:

      • 我刚刚编辑了我的问题,试图澄清为什么我试图在参数中发送一个键值数组,能够允许这样的请求?filter=&lt;my key-value array&gt;&amp;sorting=&lt;another key-value array&gt;&amp;page=1&amp;limit=50 其中filtersorting可以有相同的密钥。
      • 啊,我现在明白了,在这种情况下,您仍然只需要您希望过滤的参数的键和值,这应该意味着只有排序是问题,因为您需要指定键,无论它们是是升序和降序,以及按什么顺序。如果您必须支持多个排序依据值,例如?name=M&amp;age=4&amp;sortBy=name+asc,age+desc。我强烈建议您在 GET 请求中使用过滤键和值作为查询参数,因为这是查询 RESTful 资源的一种相当标准的方式。
      • 感谢@RossTurner。如果使用像?page=1&amp;limit=50 这样的其他参数呢? nameage 处于同一级别是否正确?
      • 个人我认为是,您正在查询/过滤您正在向其发出 GET 请求的资源 - 因为没有任何查询参数的资源/URL 可以代表所有结果,这些查询参数中的每一个都会进一步过滤响应。
      • 从 REST 的角度来看是有意义的。唯一我仍然看不清楚的情况是资源具有pagelimit 或其他与我的保留参数冲突的密钥的情况。带有_name 的前缀会是一个解决方案吗?我不太喜欢。更多想法?
      猜你喜欢
      • 2015-03-03
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 2021-12-31
      相关资源
      最近更新 更多