如何组织网址?

时间:2011-02-12 20:27:46

标签: design-patterns language-agnostic architecture

假设我有一个Web应用程序,服务器和客户端都有几个模块。每个模块都有一些服务器URL路径来访问/操作该模块的数据。为了论证,假设我们的应用程序中有“博客”。

例如,获取博客的服务器URL路径可能为/blogs/getBlog,保存博客的路径可能为/blogs/saveBlog

对于客户端,我可以看到两个选项:

  1. 将网址存储在一个网址管理器类中。例如,它将包含一个名为getBlogUrlsaveBlogUrl的属性,以及其他模块的更多(类似)属性。
  2. 将URL存储在每个单独的模块中。例如,Blog类可能具有前面提到的URL作为其自身的属性。
  3. 在构建系统时,您会选择哪些以及为什么?您可以使用其他选项来整理网址吗?

2 个答案:

答案 0 :(得分:2)

我个人倾向于选择遵循主题 - 动词模式的URL方案。例如:

/blog/new
/blog/{blog_id}
/blog/{blog_id}/newpost
/blog/{blog_id}/edit

请注意,复合科目完全没问题:

/blog/{blog_id}/post/{post_id}
/blog/{blog_id}/post/{post_id}/edit

通常,您不希望超过两个ID。如果它变得更复杂,你可以创建一个URI安全的编码protocol buffer,它将几个id组合成一个不透明的复合id,可以反序列化到服务器端的组件部分。所以而不是:

/blog/{blog_id}/post/{post_id}/comment/{comment_id}

使用:

/comment/{merged_id}

你可能希望保持一致。尽量避免混合和匹配平面和分层URI方案。这往往会让人感到困惑。

对于特别是API,您通常希望使用/{api_name}/{api_version}/为所有内容添加前缀,因为事实证明,对API进行重大更改并不适合使用API​​的人。版本控制允许API上的任何开发人员在方便时进行升级,并为您提供了一种优雅地弃用旧格式和URI方案的方法,而不是一次性弃用。

就客户端跟踪要调用的URI而言,一种选择是提供发现机制。这就是Google为我们的下一代API客户端所做的工作。客户端可以从发现文档中自动发现URI结构,以及必需参数和可选参数列表。这允许客户端重用多个API,并允许开发人员以RPC样式或REST样式工作,同时解耦大部分逻辑。这种方法肯定有更多的前期工作,但如果您的系统足够复杂或者您有足够的API维护M API客户端×N客户端语言变得站不住脚,那么它是完全值得的。

答案 1 :(得分:1)

我会尝试不同的方法 - 按模块标识符识别模块 - 只是一些不基于模块位置的唯一字符串。让服务器模块向注册表模块注册id和路径列表(相对URL)。

注册表模块能够将路径转换为绝对URL,并且具有客户端可以从中读取模块标识符映射到模块URL列表的接口(如果需要,还有一些元数据)。

在客户端中,您可以使用带有getUrls(moduleId)方法的单例(?)注册表模块,所有模块都可以从此处读取它。因此,在客户端模块中,仅存储不应更改的标识符,并且注册表模块具有简单且稳定的接口。