- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试做出架构决策,但我担心在设计基本的 REST API/框架时我会遗漏一些关于 URL 路由/映射的重要内容。
创建路由类等通常在 REST API 框架中看到的类,需要手动将 URL 映射到类和类方法(操作),这似乎无法封装问题。当这一切都可以通过动态解析 URL 并具有自动路由器或首页 Controller 来确定时。GET https://api.example.com/companies/
获取所有公司列表的集合资源。GET https://api.example.com/companies/1
通过 ID 获取单个公司。
这一切似乎都遵循模板:https://api.example.com/<controller>/<parameter>/
好处一:URL解耦和抽象
我认为拥有典型路由类的纸上好处之一是您可以从资源/物理类中解耦或抽象 URL。所以你可以有任意的 URL,比如 GET https://api.example.com/poo/
而不是 GET https://api.example.com/companies/
如果您愿意,它可以获取所有公司。
但在我见过的几乎所有示例和用例中,希望有一个与所需 Controller 匹配的 URL , Action 和参数,1:1。
另一个可能的好处是,使用 URL 映射和典型路由器可能更容易实现资源中的集合资源或嵌套资源。例如:GET https://api.example.com/companies/1/users/
或者GET https://api.example.com/companies/1/users/1/
想出一个可以动态解析它以了解调用哪个 Controller 以获取数据、使用哪些参数以及在何处使用它们的范式可能非常具有挑战性。但我想我已经提出了一种标准方法,可以使这项工作动态进行。
而手动映射这将很容易。
我可以重新路由 GET https://api.example.com/companies/1/users/
到用户 Controller 而不是公司 Controller ,绕过它,只需将参数“1”设置为 WHERE 子句的公司 ID。
优势 1.1:与物理路径无关
好处 1 的补充是,开发人员可以完全更改 URL 方案和文件夹结构,而不会影响 API,因为一切都是抽象映射的。如果我选择移动文件、文件夹、类或重命名它们,应该只是更改映射/路由的问题。
但是仍然没有真正得到这个好处,因为即使你不得不将整个 API 移动到另一个位置,.htaccess 中的一个微不足道的变化会立即解决这个问题。
所以这:GET https://api.example.com/companies/
到GET https://api.example.com/v1/companies/
不会影响代码,即使是最轻微的。即使使用动态路由器。
好处 2:控制公开的功能
我想象一个典型的路由器类通过一个只解释和解析 URL 的动态路由器给你的另一个好处是控制你想要向 API 使用者公开什么功能。如果你只是动态地做所有事情,你就有点放弃了,自动让你的消费者访问整个系统。
我认为这对动态路由器可能有好处,因为您不必手动定义所有路由并将其映射到资源。这一切都在那里,自动。为了解决暴露问题,我可能会反其道而行之,方法是定义 API 使用者不应被允许使用的功能的黑名单。我可能更省时,定义一个黑名单,然后用映射定义每个可用资源。再说一次,我想这也风险更大。你甚至可以做一个白名单......这类似于典型的路由器,但你根本不需要任何扩展逻辑。在将 URL 传递给动态路由器之前,它只是系统将检查的 URL 列表。或者它可能只是动态路由器类的私有(private)属性。
好处 3:当 HTTP 方法不完全符合要求时
我看到典型路由器 Shiny 的一种情况是,您需要执行与现有资源冲突的操作。让我解释。
假设您想通过在您的用户类中运行登录功能来验证用户身份。但是现在,你不能执行 POST https://api.example.com/users/
使用凭据,因为这是为添加新用户保留的。相反,您需要以某种方式在您的用户类中运行 login 方法。您不想使用 POST https://api.example.com/users/login/
或者,因为那时您正在使用 HTTP 方法以外的动词。但是,对于典型的路由器,您可以直接映射它,如前所述。简单。
url => "https://api.example.com/tenant/"
Controller => "users"
Action => "login"
Params => "api_key, api_secret"
但是,我再一次看到了一个合理的选择。我可以创建另一个 Controller ,称为登录或租户,它实例化我的用户 Controller ,并运行登录功能。所以消费者可以只是 POST https://api.example.com/tenant/
,有凭据,并责备。验证。
虽然,为了让这个替代方案工作,我必须物理创建另一个 Controller ,当使用 URL 映射器时,我不需要。但是这种关注点、功能和资源的分离也很好。但是,也许这是主要的权衡,您是宁愿只定义 URL 路由,还是必须为遇到的每个细微差别创建新类?
我没有看到或理解什么?我是否在这里缺少一个核心概念而只是无知?拥有典型的 URL 映射和路由类和功能是否有更多好处,我只是不知道,或者我几乎已经知道了?
最佳答案
你描述的路由的很多好处是正确的,你所说的一些物理映射也是正确的。我想提供一些经验/实用信息,这些信息在过去几年中影响了我对路由器的看法。
关于api - 当 URI 可以动态解析时,路由器有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19230771/
如果函数定义顺序不对,Jslint 将指出错误。 显然 jslint 是严格的,但我想知道将函数按顺序排列是否有任何好处。 我的意思是在调用它们之前定义它们。 最佳答案 函数定义(和 var 语句)被
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我注意到Flask tutorial涉及到点的使用。看起来它只是用于在本地创建一个轮子,这将使服务器上的设置变得更容易,但作为一个网络开发新手,我很好奇:是否有人真的会一路将他们的网站上传到像 PyP
我一直在阅读有关 jquery live event 的内容,但仍然有点困惑?使用它有什么好处? http://docs.jquery.com/Events/live 我知道它与绑定(bind)类似,
这是我的故事:我已将我的应用迁移到 AndroidX,因为我需要从网上找到的库中获取一些新功能。 问题:我目前遇到了一些问题,因为我现在需要为 Cordova 开发一个插件来实现该应用程序的一部分。
在使用 RAD 或一般不使用单元测试时使用依赖注入(inject)是否有任何好处? 最佳答案 是的,有以下几个好处: 减少依赖 减少依赖携带 更多可重用代码 更多可测试代码 更具可读性的代码 更多引用
我目前正在构建一个通过 MSI Windows Installer 分发的产品。我们的客户正在使用不同的形式(例如我们在他们自己的 MSI 中)集成该产品,使用 Bootstrap /链接器(如 Wi
有人声称 Scala 的类型系统是图灵完备的。我的问题是: 这有正式的证据吗? 简单的计算在 Scala 类型系统中会是什么样子? 这对 Scala 这种语言有什么好处吗?与没有图灵完备类型系统的语言
我开始尝试使用 React,我注意到我正在制作的简单应用程序全部使用 JS。我的 html 页面只是一个空的 body 标签! 所以我有几个问题,因为我是这个框架的新手。 我的整个应用程序应该基本上都
我们有一个相当大的基于 Windows 的 1.1 .NET 应用程序,我们正在考虑升级到 2.0。我们考虑更新的主要原因是我们可以利用 Visual Studio 2008 进行项目的持续开发,以及
我有一个页面,其中内置了基于 ajax 的分页。分页用于页面中的“评论”功能。根据 Google 的网站管理员博客,具有 rel="next"和 rel="prev"值有利于 SEO。 我在头部添加了
我是一名优秀的程序员,十分优秀!