2017-10-20 44 views
3

我差不多是REST的新手,现在我有这种情况,我不知道这是对还是错,我在做什么。据我所知,在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

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

背景:我需要保留用户点击文件夹的结构。例如。 /vacations/2016 Japan/Tokio在我的服务器/后端进一步处理它。因为我没有看到实现这个目标的另一种方式,所以我想听听你的选择。谢谢。

+1

是的,'2016日本'是ID,我明白你的意思。用户负责选择他/她的文件夹结构。所以他们分配的文件夹名称将是我的REST端点的ID。以Dropbox为例。 – Magiranu

+0

虽然,使用'/ 2016/Japan'这样的结构可能更有意义。 –

回答

2

据我所知,有在REST世界上没有严格的规定

权利; REST不关心你用于资源标识符的拼写。从客户的角度来看,标识符是不透明的。服务器可以根据自己的判断将信息编码到它们中,并用于它自己的专用。

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

您可以点击一个标有文件夹的链接,这会让您获得这些文件夹的表示,包括标有“假期”的条目。点击该链接可以获得另一个表示,其中包括标有“2016日本”的链接。点击那个链接会让你看到这个,等等。

链接的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

背景:我需要保留的文件夹结构用户点击了。例如。/vacations/2016 Japan/Tokio在我的服务器/后端进一步处理它。因为我没有看到实现这个目标的另一种方式,所以我想听听你的选择。

这有点t。。 REST架构风格使用分层风格。这意味着服务器上没有会话状态;客户端只是发送链接。

这意味着,当服务器收到/folders/vacations/2016%20Japan请求时,它不能知道客户以前访问过的/folders/folders/vacations。例如,我可能会跟踪您通过电子邮件发送给我的链接。

注意:这样构成URI没有任何问题;服务器可以以任何想要的方式将信息编码到uri中。你只需要小心你对客户状态的假设。

这就是说,如果你不打算层次结构,然后path segments可能不是你最好的选择

路径组件包含数据,通常以分层形式

非分层组织数据通常以两种方式之一处理;或者通过其编码到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,红宝石和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模板库使得这些拼写更实用。

+0

精彩而彻底的答案帮助我更详细地了解这个特定主题。我不确定我是否了解所有内容,但我会多读一遍。我还有17个小时,直到我可以奖赏你的赏金。感谢您投入这篇文章的时间和精力。我怎么能给你买啤酒? :-) – Magiranu

相关问题