将键值传递给RAL API中的键值以下HAL

问题描述:

我正在开发基于HAL规范的REST API。 API正在使用Symfony在PHP中开发,客户端正在构建在angularjs中。 API必须返回一些列表,它们将使用ngtables library来显示,并且需要过滤选项,理想情况下采用ngtables使用的格式,如this sample将键值传递给RAL API中的键值以下HAL

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

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

我的前端,同事是在暗示我直接发送编码为URL参数的JSON,像这样:

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

虽然我不太确定。

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

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

EDITED:@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可以有相同的密钥。

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

@Ross特纳:

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

我不同意@ inf3ero的答案 - 确实有一个非常明确的方式发送查询作为GET请求的一部分 - 查询参数。如果你想要不同的键和值组合,这是查询参数的键和值的主体,所以在你的例子中,你应该使用?name=M&age=4并在你的服务器上解析每一个。它应该很简单,通过遍历JSON对象中的键来将

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

转换为此。我不确定为什么如果您试图在HAL规范之后实现RESTful API,您会希望将它们组合到一个参数中。

+0

我刚刚编辑我的问题,试图澄清为什么我试图发送一个键值数组内的参数,能够允许这样的请求'?filter = &排序= &page = 1&limit = 50'其中'filter'和'sorting'可以有相同的键。 – 2014-11-25 13:05:15

+1

啊我现在看到,在这种情况下,您仍然只需要键和值的参数,你希望过滤,这应该意味着只有排序是问题,因为你需要指定的键,无论是上升和下降,并在哪个命令。如果你必须支持多个排序值,比如'?name = M&age = 4&sortBy = name + asc,age + desc'。 我强烈建议您使用过滤键和值作为GET请求上的查询参数,因为这是查询RESTful资源的一种相当标准的方式。 – 2014-11-25 13:15:53

+0

谢谢@RossTurner。如果使用另一个参数如'?page = 1&limit = 50',怎么办?将“name”或“age”设置在同一级别是否正确? – 2014-11-25 13:25:09