- 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/
我一直在使用 AJAX 从我正在创建的网络服务中解析 JSON 数组时遇到问题。我的前端是一个简单的 ajax 和 jquery 组合,用于显示从我正在创建的网络服务返回的结果。 尽管知道我的数据库查
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我在尝试运行 Android 应用程序时遇到问题并收到以下错误 java.lang.NoClassDefFoundError: com.parse.Parse 当我尝试运行该应用时。 最佳答案 在这
有什么办法可以防止etree在解析HTML内容时解析HTML实体吗? html = etree.HTML('&') html.find('.//body').text 这给了我 '&' 但我想
我有一个有点疯狂的例子,但对于那些 JavaScript 函数作用域专家来说,它看起来是一个很好的练习: (function (global) { // our module number one
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我需要编写一个脚本来获取链接并解析链接页面的 HTML 以提取标题和其他一些数据,例如可能是简短的描述,就像您链接到 Facebook 上的内容一样。 当用户向站点添加链接时将调用它,因此在客户端启动
在 VS Code 中本地开发时,包解析为 C:/Users//AppData/Local/Microsoft/TypeScript/3.5/node_modules/@types//index而不是
我在将 json 从 php 解析为 javascript 时遇到问题 这是我的示例代码: //function MethodAjax = function (wsFile, param) {
我在将 json 从 php 解析为 javascript 时遇到问题 这是我的示例代码: //function MethodAjax = function (wsFile, param) {
我被赋予了将一种语言“翻译”成另一种语言的工作。对于使用正则表达式的简单逐行方法来说,源代码过于灵活(复杂)。我在哪里可以了解更多关于词法分析和解析器的信息? 最佳答案 如果你想对这个主题产生“情绪化
您好,我在解析此文本时遇到问题 { { { {[system1];1;1;0.612509325}; {[system2];1;
我正在为 adobe after effects 在 extendscript 中编写一些代码,最终变成了 javascript。 我有一个数组,我想只搜索单词“assemble”并返回整个 jc3_
我有这段代码: $(document).ready(function() { // }); 问题:FB_RequireFeatures block 外部的代码先于其内部的代码执行。因此 who
背景: netcore项目中有些服务是在通过中间件来通信的,比如orleans组件。它里面服务和客户端会指定网关和端口,我们只需要开放客户端给外界,服务端关闭端口。相当于去掉host,这样省掉了些
1.首先贴上我试验成功的代码 复制代码 代码如下: protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
什么是 XML? XML 指可扩展标记语言(eXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。 你可以通过本站学习 X
【PHP代码】 复制代码 代码如下: $stmt = mssql_init('P__Global_Test', $conn) or die("initialize sto
在SQL查询分析器执行以下代码就可以了。 复制代码代码如下: declare @t varchar(255),@c varchar(255) declare table_cursor curs
前言 最近练习了一些前端算法题,现在做个总结,以下题目都是个人写法,并不是标准答案,如有错误欢迎指出,有对某道题有新的想法的友友也可以在评论区发表想法,互相学习🤭 题目 题目一: 二维数组中的
我是一名优秀的程序员,十分优秀!