在 REST API 资源名称中使用通配符 (*)

jla*_*nza 5 api rest design-patterns

在 REST API 中使用 * 作为资源 ID 是否明智?我想用它来搜索。我正在使用 RESTEasy 来开发我的网络服务。

假设我有用户资源,用户有姓名和年龄。然后我的 REST API 看起来像:

/users/{id}/name
/users/{id}/age
Run Code Online (Sandbox Code Playgroud)

现在,如果我想显示所有名称,我正在考虑使用以下内容:

/users/*/name
Run Code Online (Sandbox Code Playgroud)

这是正确的还是我应该使用另一种方式?

编辑 1:添加子资源

从答案中建议使用字段查询参数。但是让我们假设我现在想要一些子资源的属性。例如:

/user/*/name/full
/user/*/name/short
Run Code Online (Sandbox Code Playgroud)

如果我遵循字段选项,我将不得不这样做:

/user?fields=name-short 
/user?fields=name-full 
Run Code Online (Sandbox Code Playgroud)

这并不好,因为 name 的属性以某种方式链接到 name 类。

请考虑这个例子。试着理解这个想法 ;)

cas*_*lin 3

查询参数

您可能可以使用通配符,但不能按照问题中显示的方式使用。如果您想在同一请求中获取除姓名之外的更多详细信息怎么办?

您可以使用查询参数来允许对users集合进行字段选择:

/users?fields=name
Run Code Online (Sandbox Code Playgroud)
/users?fields=age
Run Code Online (Sandbox Code Playgroud)
/users?fields=name,age
Run Code Online (Sandbox Code Playgroud)

或者您可以从 Google Drive API 中处理部分响应的方式获得一些灵感:

/users?fields=name(short,full)
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用点符号

/users?fields=name.short,name.full
Run Code Online (Sandbox Code Playgroud)

或者混合使用两者,就像在Spotify API中一样。

自定义媒体类型

如果不需要字段选择,则可以使用自定义媒体类型返回一组预定义的字段