具有多个参数的 RESTful Spring 服务

Posted

技术标签:

【中文标题】具有多个参数的 RESTful Spring 服务【英文标题】:RESTful Spring service with multiple parameters 【发布时间】:2011-12-20 16:32:10 【问题描述】:

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

假设以下服务例程

@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 - 双重请求,似乎不直观 添加多个 URL 参数 (?id=foo&id=bar&.....&id=foobar)

我知道以前有人问过类似的问题(calling-a-restful-service-with-many-parameters、how-to-create-rest-urls-without-verbs、can-you-build-a-truly-restful-service-that-takes-many-parameters),但我发现很难找到令人满意的答案,或者至少是基于RestTemplate 的答案。

【问题讨论】:

【参考方案1】:

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

我会推荐第一个。我确定它在resttemplate中是允许的。查看您提供的文档,只需实现其中一种 post 方法。他们每个人都将请求作为参数。在里面,我确信有某种getRequestParameters() 方法的实现,您可以使用它从包含您的 ID 的请求正文中解析 json/xml。

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

/commonparent/parentId

然后在您的请求处理程序中,查询所有 id,然后像往常一样继续。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于具有多个参数的 RESTful Spring 服务的主要内容,如果未能解决你的问题,请参考以下文章

如何设计具有多个输入参数的 RESTful URL

具有多个参数值的 Laravel RESTful API

Spring RESTful Web 服务身份验证

在RESTFUL风格中怎样定义需要多个参数才能确定的资源路径

spring-cloud 构建一个restful的web服务

Spring Boot 构建一个RESTful Web服务