友好的URL结构?

3
我上周建立的爬虫服务中缺少的一个很重要的东西是美观的URL。现在用户参数通过? u = 传递到脚本中,这是懒惰的hack的症状(脚本确实如此)。然而,我一直在考虑重新做它,并希望得到一些关于可用选项的反馈。现在有两个页面,更新和图表,向用户提供信息。以下是我想出的两种可能性。 “1234”是用户ID编号。由于技术原因,用户名遗憾地不能使用:

  • http://< tld >/update/1234
  • http://< tld >/chart/1234

或者

  • http://< tld >/1234/update
  • http://< tld >/1234/chart

概念上,选项#1是使用用户ID调用更新。选项#2提供了对用户ID操作的动词。

从一致性的角度来看,哪个更有意义?


另一个提到的选择是

  • http://< tld >/user/1234/update
  • http://< tld >/user/1234/chart

这为与特定用户无关的页面提供了空间,例如:

  • http://< tld >/stats
9个回答

6
如果您采用这种方案,就可以轻松地阻止(表现良好的)机器人爬取您的网站:
 http://< tld >/update/1234
 http://< tld >/chart/1234

这是因为您可以设置/robots.txt文件,其中包含以下内容:
 Disallow /update/
 Disallow /chart/

对我来说,这是一个常被忽视的不错的额外福利。

5

选项#1与常见的ASP.NET MVC示例相匹配。在Model View Controller模型中的一些示例采用{controller}/{action}/{id}的形式。在.NET 3.5路由快速入门中有一张表格显示了一些有效的路由模式:

路由定义 -- 匹配URL的示例

{controller}/{action}/{id} -- /Products/show/beverages

{table}/Details.aspx -- /Products/Details.aspx

blog/{action}/{entry} -- /blog/show/123

{reporttype}/{year}/{month}/{day} -- /sales/2008/1/5

{locale}/{action}
-- /en-US/show

{language}-{country}/{action}
-- /en-US/show


实际上它只是匹配你找到的演示。MVC与URL编写器无关。 - Nick Berardi
更新以包括其他选项。感谢发现。 - Larry Smithmier

5

我倾向于选择第二个选项,以userid为首选,因为目录结构(存在的部分)是用户数据的两个不同功能。它是用户的图表和用户的更新。

然而,这只是一个小问题,需要知道是否有计划对此进行重大扩展的功能。

  • 未来的所有内容都会增加到单个用户的foo、bar和baz吗?如果是这样,出于上述原因,第二个选项更具吸引力——userid是核心数据,从语义上讲,从它开始是有意义的。
  • 您是否要添加非用户驱动的功能?那么以头文件目录为首选可能是有意义的——/user/1234/update、/user/1234/chart、/question/45678/activity、/question/45678/stats等。

1
我并不预期这个功能会有很大的增长,因为页面的目标是提供缺少于StackOverflow本身的功能。还有一些其他的脚本还没有公开,它们处理服务的整体统计数据。您的/user/1234/verb很吸引人。 - Kyle Cronin

4

我个人喜欢这种风格,因为它保持了用户的一致性,同时还可以让您对他们有特定的见解。

  • http://< tld >/1234/update (更新)
  • http://< tld >/1234/chart (图表)

如果你采用另一种方式,我希望能够看到/update或/chart下的所有内容,然后再按用户缩小范围。


1

选择后者;URL 应该是分层的(或者至少,用户通过类比本地目录路径来阅读它们)。这里的重点是特定用户的不同视图,因此“用户”是更一般的概念,应该首先出现。


1
我刚刚回答了一个关于如何构建URL路由的问题"(如何构建URL路由?)",并就如何使URL RESTful、易于操作和用户友好性发表了自己的看法。 我认为最好提供链接而不是在此问题中写类似的内容,因此提供了链接。

0

就上下文而言,我认为应用程序后跟参数比项目的代理键后跟项目内容更有意义。最终,我建议您选择编程更自然的方式。


#1 更容易,因为我使用 Apache 的 MultiViews 将动词翻译成脚本名称。但是,如果以另一种方式引用它更有意义,我也可以让它正常工作。 - Kyle Cronin

0

惯例是对象/动词/ID,所以应该是:

http://< tld >/user/update/1234

(我刚注意到这符合您更新的问题 :)

所以,第3个选项是最好的选择。

这支持您提到的非用户操作(统计信息/)以及多用户操作:

http://< tld >/user/list/


0
如果有一种列出用户的方法,我会引入一个用户部分:
http://< tld >/users/ <--- user list
http://< tld >/users/1234/ <--- user profile, use overloaded POST on this to update.
http://< tld >/users/1234/chart/ <--- user chart

如果您只能看到自己的详细信息,即用户对彼此不可见,则不需要用户ID,因为您可以从会话中推断出它:

http://< tld >/user/ <--- user profile, use overloaded POST on this to update.
http://< tld >/user/chart/ <--- user chart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接