具有多个参数的RESTful Spring服务

时间:2011-12-20 16:32:11

标签: java spring url rest resttemplate

我正在构建一个宁静的服务,需要接受任何数量的参数,而不是下面示例中的 one

假设以下服务程序

@RequestMapping("/start/id/{id}", RequestMethod.GET)
public void startService(@PathVariable String id) {...}

有一个基于RestTemplate

的客户端实现
restTemplate.getForObject("/start/id/{id}", null, id);

问题但鉴于可能有数千ids,我需要使用RestTemplate在一个请求中发送所有参数的其他方法吗?我见过这些建议

  • 向GET请求添加请求正文 - RestTemplate似乎无法实现?
  • 在ID中使用分隔符(例如id1|id2|....|idn) - 看起来像 hack
  • 首先输出参数,然后发出GET来引用ID - 双重请求,似乎不直观
  • 添加多个网址参数(?id=foo&id=bar&.....&id=foobar

我之前已经问过类似的问题(calling-a-restful-service-with-many-parametershow-to-create-rest-urls-without-verbscan-you-build-a-truly-restful-service-that-takes-many-parameters),但我发现很难找到满意的答案,或者至少基于{{{ 3}}。

2 个答案:

答案 0 :(得分:2)

我认为RESTful设计的任何部分都没有声明您的url结构应该能够解析整个集合。您的第一个(请求参数)和第三个(url参数)建议可能是最好的。

我会推荐第一个。我确信它允许重新模板。查看您提供的文档,只需实现一种post方法。他们每个人都将请求作为参数。在那里,我确信有一种getRequestParameters()方法的实现,你可以用它来解析包含你的id的请求体中的json / xml。

或者,更好的是,所有这些id如何相关?他们都有共同的父资源吗?如果是这样,那么你可以(并且可能应该)做类似的事情......

/commonparent/{parentId}

然后在你的请求处理程序中,查询所有id,并按正常方式进行。

答案 1 :(得分:1)

您可以对所有ID使用查询参数:

/search?ids=1,2,3,4,5,6,7

然后用逗号进行标记并进行搜索。请记住,如果您将其作为GET查询字符串参数发出,则您将受到最大URL长度的限制。