我正在开发基于HAL规范的REST API。 API正在使用Symfony在PHP中开发,客户端正在使用angularjs构建。 API必须返回一些列表,它们将使用ngtables library显示,并且需要过滤选项,最好采用ngtables使用的格式,例如this sample。
{ "name": "M", "age": "4" }
(当然未来的客户可能会使用相同的选项。)
我的前端工友建议我直接将json编码作为参数发送到网址中,如下所示:
?filter=%7B%20%22name%22%3A%20%22M%22%2C%20%22age%22%3A%20%224%22%20%7D%20
虽然我不太确定。
我一直在阅读如何使用类似param[]=foo¶m[]=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
filter
和sorting
可以使用相同的密钥。
答案 0 :(得分:1)
目前,没有标准方法可以在GET请求中发送查询。因此,您有两个选择:使用自定义查询语言(就像您已经尝试过的那样)或者选择标准查询语言。无论哪种方式,都很难使其成为RESTful,因为您必须创建一个链接,其中包含如何生成此类URI的配方。您可以使用URI templates,但有时它们不够通用......
@Ross Turner:
我觉得你误解了,我说的是没有标准。 OFC。有非标准的基于查询字符串的解决方案,例如RQL。或者您可以在单个参数中发送标准SPARQL查询,但没有标准方法来描述这样的链接,并且没有链接描述您无法在REST客户端中生成查询,因此它不会松散耦合,因此它将违反统一的界面约束。
答案 1 :(得分:0)
我不同意@ inf3ero的回答 - 当然,有一种非常明确的方法可以将查询作为GET请求的一部分发送 - 查询参数。如果您需要不同的键和值组合,这是查询参数的键和值的主体,因此在您的示例中,您应该使用?name=M&age=4
并在服务器上解析每个键。转换
{ "name": "M", "age": "4" }
通过遍历JSON对象中的键来进行此操作。如果您尝试按照HAL规范实现RESTful API,我不确定您为什么要将这些组合成一个参数。