【问题标题】:JAX-RS/Rest: Set a parameter multiple times, or use a single comma-delimited parameter?JAX-RS/Rest:多次设置参数,还是使用单个逗号分隔的参数?
【发布时间】:2010-09-06 17:28:50
【问题描述】:

我读到HTTP在请求中传递数组的方式是多次设置一个参数:

1) GET /users?orderBy=last_name&orderBy=first_name

但是,我也看到了逗号分隔的参数(我觉得这更“干净”):

2) GET /users?orderBy=last_name,first_name

我想实现多排序(按姓氏排序用户,然后重复的姓氏按名字排序)。代码方面,这很容易(谷歌的 Guava 库来拯救),但我应该如何公开它呢?第一种方法甚至保留字段的顺序(按姓氏排序,然后按名字排序)?

如果在请求中多次设置,Spring会神奇地将参数转换为String[]数组:

... @RequestParam("orderBy") String[] orderBy ... becomes ["last_name","first_name"]

这让我相信第一种方式被认为是最佳实践,尽管我喜欢第二种方式......

【问题讨论】:

  • 这取决于您从谁那里获得了@RequestParam。不过,它可能在 JAX-RS 标准中指定。

标签: parameters jax-rs


【解决方案1】:

第一种方法是首选的标准方法。

您当然可以使用第二种方式,但您必须实现自己的方式来标记请求参数值,以及涉及的所有问题。例如,考虑如果您的某个值包含“,”字符会发生什么。

因为第一个是相当标准的,它的好处是可以很好地适应 jax-rs 和验证框架;因为我们总是验证我们的输入,对吧? ;)

【讨论】:

  • 订单对 OP 要求至关重要,但我认为订单不能由规范保证。所以第一种方法不可靠,不应该使用。
【解决方案2】:

我认为这是一个见仁见智的问题。 JAX-RS 允许您使用以下参数:

@QueryParam("orderBy") List<String> orderBy

我认为在“神奇转换”部分方面会与 Spring 做同样的事情。我不一定认为这表示“最佳实践”。只是某些参数可以有多个值,而框架允许您读取这些多个值(想想某些 HTML 表单)。

就个人而言,我会使用逗号分隔的单个值。就像您说的那样“更干净”,并且值更容易构建(您不依赖于参数键/值的顺序,这可能会给客户端开发人员带来一些麻烦)。

【讨论】:

  • 此方法将返回包含一个元素“last_name,first_name”的列表。不是吗?
  • @Normal 我的意思是示例 List 代码行将接近 Spring 提供的内容。我不确定 JAX-RS 规范是否被澄清以保持秩序(我相信大多数实现现在应该)。逗号分隔的单个值是一种替代方法(如果您将 List 和逗号分隔的单个字符串结合起来,您将只得到一个您评论的元素)。回过头来看,带有“GET /users?orderBy=last_name&orderBy=first_name”的 List 方法也很好,在其他语言框架中更像是一种标准方法。
猜你喜欢
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 2019-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多