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

Posted

技术标签:

【中文标题】如何设计具有多个输入参数的 RESTful URL【英文标题】:How to design RESTful URL with many input parameters 【发布时间】:2013-03-07 04:46:58 【问题描述】:

我正在努力创建一个使用 Spring MVC 的基于 Java 的 RESTful API。

现在对于一些 API 端点——需要多个不同的参数...我不是在谈论值列表——更像是 parameter1、parameter2、parameter3、parameter4 等等——其中所有 4 (或更多)参数也属于不同的数据类型。

如何为上述场景设计 API 端点 URL,例如为 4 个单独的输入参数?有没有推荐的方法/最佳实践来做到这一点?还是我只是将这 4 个值连接起来,每对值都用“/”之类的分隔符分隔?

从用户评论编辑:

示例:我必须根据 4 个输入参数检索自定义对象(“文件”)——(整数)用户 ID、(整数)文件 ID、(字符串)类型和(字符串)用户类型。我应该简单地创建一个像“getfile/userid/fileid/type/usertype”这样的 REST 端点——还是有更好(或推荐的方式)来构建这样的 REST 端点?

【问题讨论】:

我认为您需要指定资源以及这些参数是什么,以便人们帮助您。 @bryanmac-- 好的,一个例子是我必须根据 4 个输入参数检索一个自定义对象(一个“文件”)——(整数)用户 ID、(整数)文件 ID、(字符串)类型, 和(字符串)用户类型。我应该简单地创建一个像“getfile/userid/fileid/type/usertype”这样的 REST 端点——还是有更好(或推荐的方法)来构建这样的 REST 端点?谢谢...跨度> 【参考方案1】:

在 REST 中,首先考虑资源并提出不可变的永久链接(不会更改)来识别该资源。

因此,在您的示例中(在评论中),您说要检索用户和类型的文件资源(文件类型或用户类型?)

因此,首先要提供足够的信息来识别资源。如果 id 是唯一的,那么无论拥有该文件的用户如何,这都足以识别资源:

/files/fileId

如果文件可以更改所有者,这与 url 一样重要 - 请记住,我们希望仅使用所需的组件来识别资源,以便它可以成为永久链接。

您还可以列出特定用户的文件:

/users/userId/files/

响应将包含文件列表,列表中的每个项目都将包含指向文件的链接 (/files/fileId)

如果由于某种原因文件 id 不是唯一的,但仅在用户的上下文中是唯一的(文件不会更改所有者并且用户内的 id 会增加 - 奇怪),那么您将需要这些组件来识别资源:

/users/userId/files/fileId

还要注意根据描述的顺序。在那种奇怪的情况下,我们说文件在逻辑上由用户包含和标识,这也是 url 结构中的包含。

希望对您有所帮助。

【讨论】:

【参考方案2】:

file/usertype/user/type/fileidGET 请求听起来不错

【讨论】:

@ArunPJohny- 有没有更好/更优雅的方法来做到这一点?我的意思是,除了一个接一个地询问所有 4 个参数之外,没有其他选择吗?谢谢.... 我不这么认为,对于请求,您需要所有 4 个参数,这意味着您必须将它们发送到服务器。唯一的问题是如何,但作为休息资源,这是最好的格式恕我直言

以上是关于如何设计具有多个输入参数的 RESTful URL的主要内容,如果未能解决你的问题,请参考以下文章

如何设计一个restful风格的API

具有多个参数值的 Laravel RESTful API

具有多个参数的 RESTful Spring 服务

RESTful API 设计:url 参数应该有默认值吗?

URL地址中使用中文作为的参数

如何将参数解析为 RESTful API