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

标签 rest restful-architecture

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

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

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

获取:http://localhost:80/srv1/public/api/v1/folders/vacations

结果是这样的:

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

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

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

问题是:这是否是错误的,因为我为端点使用了多个值/参数?

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

最佳答案

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

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

但一个好的经验法则是考虑 1990 年代的网站会是什么样子。

您可以单击一个标记为文件夹的链接,这将为您提供这些文件夹的表示,包括一个标记为“假期”的条目。单击该链接将为您提供另一种表示形式,其中将包含一个标记为“2016 Japan”的链接。单击该链接会给你一个代表,等等。

链接的 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允许在 URI 空间中的不同点重用表示 - 客户端可以遵循标准 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 状态;客户端只是发送链接。

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

注意:以这种方式组合 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 和 Richardson 建议使用 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定义 variable expansions ;访问支持 level 4 templates 的 URI 模板库使这些拼写更加实用。

关于rest - 当我在端点上使用多个值时,是否违反了 REST 最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46849680/

相关文章:

rest - 如何使用 Wt 启动并运行 Restful API

restful-authentication - Restful API : how to access the api securely?

api - Paypal Restful API 可用性澳大利亚

java - org.glassfish.jersey.internal.RuntimeDelegateImpl 未找到

api - 为 REST API 编写单元测试的最佳方式是什么?

ios - Swift 发布请求 - JSON 正文为空

java - 如何在通过 JAX-RS (Apache-CXF 实现)ExceptionMapper 准备的错误响应中保留请求 header

web-services - 微服务架构中如何处理http请求和响应?

JAVA 休息服务 Jersey 返回 404

typescript - 如何在 GraphQL 中的解析器中获取输入类型的数组