假设我有一个Web应用程序,服务器和客户端都有几个模块。每个模块都有一些服务器URL路径来访问/操作该模块的数据。为了论证,假设我们的应用程序中有“博客”。
例如,获取博客的服务器URL路径可能为/blogs/getBlog
,保存博客的路径可能为/blogs/saveBlog
。
对于客户端,我可以看到两个选项:
getBlogUrl
和saveBlogUrl
的属性,以及其他模块的更多(类似)属性。Blog
类可能具有前面提到的URL作为其自身的属性。在构建系统时,您会选择哪些以及为什么?您可以使用其他选项来整理网址吗?
答案 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)方法的单例(?)注册表模块,所有模块都可以从此处读取它。因此,在客户端模块中,仅存储不应更改的标识符,并且注册表模块具有简单且稳定的接口。