RESTful URL 设计:公共 API 与私有 API、分层 API 设计模式、URI 与 URL 设计?

2024-02-20

我经常遇到这样的问题,与此非常相似分层 RESTful URL 设计 https://stackoverflow.com/questions/7833548/hierarchical-restful-url-design?rq=1

假设该服务仅提供用户上传文档。

POST, GET /accounts
PUT, DELETE /accounts/{name}  or /accounts/{id}

现在,文档被附加到特定用户,这里不关心它是否公开。

这两种方式是POST /documents vs POST /users/documents

为什么?因为稍后创建文档资源时,该文档就处于用户的控制之下。所以我希望有

GET, PUT, DELETE /users/{name}/documents用于获取、更改和删除用户拥有的大量文档。

我可以有GET, PUT, DELETE /users/{name}/documents/{name/id}

但同样可以实现/documents/{users}/.... or /documents/{id}。这类似于组织 Unix 文件的方式(尽管/users/...也是组织文件的另一种方式...)你看,还有一种哲学[phy of uri vs url design。

另一个考虑因素是 API 对用户是否可见。如果这只是一个后端 API,则只有开发人员可以访问(backend <- frontend server <- frontend ajax),那么网站用户可能会更满意/users/{name}/documents/{id/name}而如果 API 是公开的(如 twitter api),一些程序员会不喜欢这个长 url。

人们对这些问题有何看法?


实际上,显然以上所有内容都是正确的。

但从哲学上讲,我认为这可以归结为 REST 中的“S”……这实际上是一个关于您管理状态的资源实际上是什么的问题。如果您的应用程序旨在处理文档,那么该资源必须是 URL 中明显的资源。如果您的应用更多的是关于用户执行某些工作流程,那么您可能希望让用户在 URL 中明显可见。

在应用程序内部,为了方便起见,事物会快速构建,以便您可以拥有混合和匹配资源的 URL,以使所有权显而易见(如您的示例所示)。这样想吧。用户开始使用您的应用程序来处理他们的东西,其中一些是文档。他们知道他们登录了,然后他们可以访问他们的文档,他们的一些信息在会话中随他们传播,从这个角度来看

user/{name}/documents

说得通。他们有背景。

如果您将该 API 公开……也就是说,如果与您的应用程序中的用户没有相同观点的人正在使用您的 API……那么该公众面孔在语义上需要清晰 - 用户是否暴露?文件?消费者关心谁拥有该文件吗?该 API 就像一个目录;它应该有帮助。

因此,如果您的 api 与其他应用程序的合同是您的应用程序正在公开文档,那么我想说您最好在 URL 中明确这一点。到用户的路由的概念在这里没有意义,因为上下文与合同无关。

你提出了一个有趣的例子,很清楚地表明了这一点。拿

document/id versus document/name

文件的命名可以遵循约定或特定于应用程序。很好的例子是图像共享应用程序或针对会计等特定行业的应用程序。但是公共 API 不能假设命名约定是明显的或显而易见的(除非您允许 API 的使用者访问此类信息)。因为它是一个面向公众的 API,所以你最好选择

document/id

因为 ids 通常被认为是不可变的,即使跨 API 也是如此,而且语义非常清晰。

最终,这项技术可以做我们想做的任何事情。但是像路由和 URL 这样的东西对于理解 API 本身的语义很重要。如果您正在管理某些内容,那么在使用 API 时这应该是显而易见的,并且不应该陷入本地或特定技术约定的困境。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RESTful URL 设计:公共 API 与私有 API、分层 API 设计模式、URI 与 URL 设计? 的相关文章

随机推荐

  • 桌面上是否有元标记或类似视口初始比例的东西?

    我知道您认为这是一个奇怪的请求 但是我目前正在与一位客户打交道 他给了我一个模板 并在浏览器中看到它并完成所有 HTML 后决定将其缩小 70 从而把我们俩所做的所有工作都抛到了九霄云外 如果我可以将比例调整为 0 7 70 那就完美了 项
  • Java字符串在数据库中保存为unicode[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有关您编写的代码的问题必须描述具体问题 and 包含有效代码重现它 在问题本身中 看SSCCE org http sscce org 以获
  • Pivotal tc Server v.3.1 无法启动

    我最近下载了STS我尝试启动 TC 服务器 但出现以下错误 Server Pivotal tc Server Developer Edition v3 1 failed to start Error Could not find or lo
  • 获取当前片段并保存 onSaveInstanceState() 方法以实现屏幕方向

    我有一个包含多个片段的活动 我还使用 actionbarSherlock 作为我的选项卡 它也连接到片段 我的问题是当我要旋转屏幕 即从纵向到横向 反之亦然 时 我的活动将再次被调用 因此它会重新启动我的活动 我不想重新启动我的活动 而只是
  • 为所有齐射请求设置自定义标头

    重写 getHeaders 可以在必要时向请求添加自定义标头 但是如果总是需要设置 X 标头怎么办 例如静态身份验证令牌 JsonObjectRequest req new JsonObjectRequest URL new JSONObj
  • postgresql 9.2 中 varchar(n) 的最大长度是多少?最好使用 varchar(n) 或 text?

    您好 我正在使用 postgresql 9 2 我想使用 varchar n 来存储一些长字符串 但我不知道 varchar n 支持的最大字符长度 哪一个更好用 你能给我推荐一下吗 谢谢 tl dr 1 GB 每个字符 实际上 代码点 可
  • C++0x 标准如何定义 C++ Auto 多重声明?

    嗯 我对即将推出的 C 0x 标准中的多个自动声明有点困惑 auto a 10 b 3 f c new Class 我在某处读到这是不允许的 原因是 因为不清楚连续声明是否应该与第一个声明具有相同的类型 示例中为 int 可能的翻译1 in
  • 在 Julia 中将类型参数引用为函数参数

    我正在尝试在 Julia 中创建 integer mod p 类型 我确信已经有一个包用于此 这只是个人练习 type Intp p v Int8 end function add a Intp p b Intp p return Intp
  • 蚂蚁串比较

    我在 ant 中有一个脚本 我需要按字典顺序比较 2 个字符串 就像是 1 2 3 compareTo 1 2 4 我找不到办法这样做 有什么想法吗 我正在使用 ant 1 8 和 ant contrib Thanks 为了使此解决方案发挥
  • 如何提高System.currentTimeMillis()粒度?

    如何在不提供非常大的数组作为输入的情况下实现它 我正在测量不同算法的运行时间 对于 20 个元素的数组 我得到非常 相同 相似的值 我尝试将总时间除以 1000000000 来清除E然后使用了 16 个镜像 我复制了输入数组并为镜像再次执行
  • 带摄像头预览的 SurfaceView 不会被破坏

    我有一个带有 2 个选项卡 活动 的选项卡活动 每个选项卡都有一个绘制在带有相机预览的 SurfaceView 顶部的 3d Open GL 场景 然而 根据设备方向 选项卡正在切换 问题是 当另一个活动启动时 它调用camera open
  • AttributeError:模块“numpy”没有属性“flip”

    错误信息 AttributeError 模块 numpy 没有属性 flip 我不明白为什么它会给我这个错误 我用谷歌搜索并确保我已经更新到最新版本的 numpy 我的工作目录中肯定没有另一个名为 numpy 的文件 任何帮助将不胜感激 n
  • r 为 ggplot2 安装色彩空间时出错

    我是 r 新手 希望能得到一些安装 ggplot2 的帮助 我使用的是 RStudio 版本 0 98 1102 请参阅下面的错误 install packages ggplot2 运行良好 library ggplot2 loadName
  • 如何从 Angular 2 Material Design 中设置 md-select 组件的默认值?

    我有以下选择组件 它是从来自 REST API 的数据填充的 如何在 md select 上设置默认选择值
  • 显示:内联块额外边距[重复]

    这个问题在这里已经有答案了 我正在和几个人一起工作div被设置为display inline block并有一套height and width 在 HTML 中 如果每个后面有一个换行符divdiv 的右侧和底部会自动添加 5 像素边距
  • Chrome 浏览器中的 Angular 多行网格性能

    我需要制作一个组件 其中包含一个包含大量行的表 所有这些都适用于小数据 但如果项目数增长到 2000 或更多 它就会变得滞后 滚动 尤其是动画变得太慢 我也尝试过设置trackBy函数为ngFor但在这种情况下它对性能没有影响 请参见堆栈闪
  • Azure Active Directory 使用默认模板为tenantId 传递空GUID

    我已经对几个拥有 Azure AAD 帐户的 MS 帐户进行了尝试 并尝试使用 Visual Studio 2015 和 2017 但遇到了完全相同的错误 错误 使用默认的 ASP NET MVC 模板与开箱即用的 AAD 集成 根本没有代
  • 阻止浏览器自动填写表单用户名和密码字段

    在Chrome浏览器中 我已经保存了用户名和密码 现在 如果我导航到其他表单 并且它包含其他内容的用户名和密码 我保存的表单将自动填充到此处 我怎样才能阻止这个 When autocomplete off不会阻止填写凭据 请使用以下内容 修
  • 是否可以粘贴溢出的 HTML 元素?

    CSS 元素position sticky大多数现代网络浏览器都支持 但一些仍然常用的浏览器 特别是 IE11 不支持它 为了解决这个问题 有各种 JavaScript 解决方案 例如 Stickyfill 和 Stickybits 然而
  • RESTful URL 设计:公共 API 与私有 API、分层 API 设计模式、URI 与 URL 设计?

    我经常遇到这样的问题 与此非常相似分层 RESTful URL 设计 https stackoverflow com questions 7833548 hierarchical restful url design rq 1 假设该服务仅