当我在端点上使用多个值时,是否违反了 REST 最佳实践?

Do I violate REST best practices when I use more than one value on my endpoint?

我或多或少是 REST 的新手,现在我遇到这样的情况,我不知道我在做什么是对还是错。据我所知,REST世界没有严格的规定,我想听听你的一两个意见。

我有以下资源: http://localhost:80/srv1/public/api/v1/folders/

通过此端点,我可以获得给定文件夹的信息。例如:

GET: http://localhost:80/srv1/public/api/v1/folders/vacations

结果如下所示:

Name       | Typ
---------- | ------
2017 Maui  | Folder
2016 Japan | Folder

现在我想要 2016 Japan 的信息并且我编程让我的端点能够接收多个值,如下所示:

http://localhost:80/srv1/public/api/v1/folders/vacations/2016 Japan

问题是:这是不是因为我使用多个 value/parameter 作为端点?

背景:我需要保留用户点击过的文件夹的结构。例如。 /vacations/2016 Japan/Tokio 在我的 server/backend 上进一步处理它。因为我看不到实现此目的的另一种方法,所以我想听听您的选择。谢谢。

As far as I know, there are no strict rules in the REST world

对; REST 不关心您对资源标识符使用什么拼写。从客户的角度来看,标识符是不透明的。服务器可以自行决定将信息编码到其中并供自己专用。

但一个好的经验法则是考虑 1990 年代网站的外观。

您可以单击带有 link 标签的文件夹,这将为您提供这些文件夹的代表,包括一个标签为“假期”的条目。单击 link 将为您提供另一种表示形式,其中包括标有“2016 日本”的 link。单击 link 会得到一个表示,依此类推。

link 的 HREF 属性中的值可以是任何值,因为您只是单击它们。

"folders" : { "href" : "/28484a30-ccf7-4b36-8f1b-cea70223d4f7" }
"vacations" : { "href" : "/2abaac1b-5bb8-4284-abb6-37953cac68b1" }
"2016 Japan" : { "href" : "/84dfc3c2-3d04-4b33-9551-cb5a35237de5" }

当恐龙在网络上漫游时,我们经常处理静态的、分层的网站。使用 relative references allowed the reuse of representations at different points in the URI space - the client could follow the standard resolution rules 计算预期的标识符。

所以你可能会看到这样的拼写

"folders" : { "href" : "/folders" }
"vacations" : { "href" : "/folders/vacations" }
"2016 Japan" : { "href" : "/folders/vacations/2016%20Japan" }

%20 因为标识符中的SP需要是percent encoded

Background: I need to retain the structure of the folders the user has clicked. E.g. /vacations/2016 Japan/Tokio to process it further on my server/backend. Because I don't see another way of achieving this I would like to hear your option.

这有点紧张。 REST 架构风格使用 Client Stateless Server 层次结构风格。这意味着服务器上没有 session 状态;客户端只是发送 links.

这意味着当服务器收到对 /folders/vacations/2016%20Japan 的请求时,它无法 知道 客户端先前访问过 /folders/folders/vacations。例如,我可能正在关注您通过电子邮件发送给我的 link。

注意:以这种方式编写 URI 没有任何问题;服务器可以以任何方式将信息编码到 uri 中。您只需要注意您对客户端状态所做的假设。

也就是说,如果您不打算采用层次结构,那么 path segments 可能不是您的最佳选择

The path component contains data, usually organized in hierarchical form

非分层数据通常以两种方式之一处理;通过将其编码为 query component

"folders" : { "href" : "/?folders" }
"vacations" : { "href" : "/?folders,vacations" }
"2016 Japan" : { "href" : "/?folders,vacations,2016%20Japan" }

或通过将其编码成个人路径段

"folders" : { "href" : "/folders" }
"vacations" : { "href" : "/folders,vacations" }
"2016 Japan" : { "href" : "/folders,vacations,2016%20Japan" }

RESTFul Web Services, Ruby and Richardson proposed using punctuation to delimit data at the same level in the hierarchy;如果顺序重要则使用逗号,否则使用分号。

请注意,没有规定您的集合中的数据需要继续进入最后一个路径段。

"folders" : { "href" : "/folders/pages" }
"vacations" : { "href" : "/folders,vacations/pages" }
"2016 Japan" : { "href" : "/folders,vacations,2016%20Japan/pages" }

RFC 6570 defines variable expansions; access to a URI Template library with support for level 4 templates 使这些拼写更加实用。