URL 结构最佳实践/标准

sam*_*sam 3 url url-design

我正在构建一个包含项目的网站,每个项目都有一个页面,例如:

website.com/book/123
website.com/film/456
website.com/game/789
Run Code Online (Sandbox Code Playgroud)

每个项目可以有多个子(和子子、子子子)页面,例如一本书可以有一个简介,一部电影可以有一个画廊,游戏也可以有一个画廊。

我的问题是,围绕为与项目关联的页面构建 URL 是否存在任何类型的标准或最佳实践?例如:

website.com/film/456/gallery
Run Code Online (Sandbox Code Playgroud)

子页面项目之后的位置,或:

website.com/film/gallery/456/
Run Code Online (Sandbox Code Playgroud)

其中 item 是 URL 的最后一部分。

有没有人知道为什么哪种方法最好,或者是否存在任何网络标准?这似乎是一件显而易见的事情,但我正在努力做出决定,我可以考虑每种方法的优缺点——尽管我倾向于前一个选项,因为这意味着以下用户路径将与 URL 匹配:

加载 website.com -> 单击“电影”(website.com/films)-> 单击“电影”(website.com/film/123)-> 单击画廊(website.com/film/123/gallery)

但关于它的一些东西似乎......关闭,可能不一致。

Ray*_*oal 5

您是正确的,前一个 URL“更好”并且部署更广泛。我认为您不会在任何标准中发现这一点;它更像是一种约定。大多数涉及 REST 的文章和书籍都是这样做的。

这样做的原因是,如您所说,URL 中的路径组件与资源和子资源的结构相匹配。特别是,以下所有内容都应该是有效的 URL:

  • 网站.com/
  • 网站.com/books
  • website.com/books/123

特别要注意,它是books/123而不是 book/123像您那样。我见过单数,但恕我直言,复数更好。

对于网址 /books

  • GET 获取所有书籍,但您可以使用查询参数限制书籍,例如 /books?author=alice
  • POST 添加一本新书(带有服务器生成的 ID)。

对于网址 /books/123

  • GET 获取那本特定的书
  • PUT 用该 id 替换书(或添加具有该客户端生成的 id 的书)

现在,如果一本书有简介,并且简介仅对特定书籍是唯一的那么您将添加以下 URL:

  • website.com/books/123/blurbs
  • website.com/books/123/blurbs/72

你可以对电影和画廊做同样的事情,前提是每个画廊都属于一部电影。但是,如果有多个电影的画廊,那么您将制作/galleries一个顶级 URL。从电影导航到画廊仍然可以。你不会有一个结构化的 URL。相反,您将通过 GET 获取包含来自电影 456 的图片的所有画廊

  • website.com/galleries?film=456

一般规则是,如果您对子资源有所有权关系,则可以使用结构化 url,但如果顶级项目之间的关系较松散,则查询参数就可以了。不要陷入 RESTful URL 没有查询参数的常见误解;他们是这样。:)

现在终于,直接回答你的问题:website.com/films/galleries/456恕我直言,这不是一个好的 URL,因为`website.com/films/galleries/它不是很有用。其实我觉得还是挺丑的。这意味着什么?所有画廊?如果是这样,应该是website.com/galleries

同样,我不认为这在任何地方都是标准化的,但感觉非常普遍和传统。