用于构建 AngularJS 应用程序的正确 API 架构
Proper API architecture for building AngularJS applications
最近我一直在和我的许多中层开发人员讨论如何构建 API,以便更好地适应 AngularJS 提供的 2 向绑定。 我们一直在尝试决定 API 是否应该非常明确地说明它们的定义,这些定义在 Angular 下会更好,但会导致中层的工作更多,或者更隐含,并且在 Angular 中有额外的逻辑来"按摩"数据到一个好的 Angular 模型中。
让我们从一个例子开始。 假设我们正在谈论某种数据备份服务。该服务允许您备份数据并将数据保留 X 年或无限期。 UI 有 2 个元素来控制此逻辑。 有一个<select>
允许用户选择是否要删除"从不"或"之后"X 年的数据。 如果选择了"从不",那么我们隐藏年份输入,但如果选择了"之后",那么我们显示年份输入并允许他们输入 1-99 之间的数字。
为此,我引入了 2 个不同的元素控件,每个控件控制 $scope
模型上的不同属性。
但是,在 API 上,我的中层人员希望使用一个名为"YearsRetention"的单个属性来控制所有这些。 如果是YearsRetention == 0
,那么"隐式"意味着我们想要无限保留,但如果它设置为 0>任何值,则保留设置为该值。
所以基本上他想使用这个值来控制保留设置,这将迫使我编写某种转换函数,以便在$scope上设置值以在 UI 中实现相同的效果。 这种转换必须同时对传入和传出数据进行。
最后,我想知道 API 是应该隐式定义(API 发送单个值,然后 Angular 必须将数据转换为可用的视图模型(还是显式定义(API 发送直接绑定到 UI 所需的所有值并减少转换 JSON 的需要(?
我认为您描述的设计中有 2 个坏主意。
- 根据 UI 便利性定义数据结构。这是一个坏主意,因为您希望 API 清晰、多用途(可能支持具有不同 UI 的不同客户端(和长期存在(API 重构在操作上成本高昂(。相反,请尝试以最纯净、最准确、最通用的形式准确简洁地表示数据,并将格式、截断、本地化、度量单位、页面布局等表示问题留给 UI。
- 重载单个数据字段以表达它不会通过"魔术值"自然建模的概念。为数字零分配额外的语义意义就是一个例子,它通常被认为是容易出错、令人困惑和泄漏的抽象。每个客户端都必须对零意味着永远的魔术语义进行编码。当然,还有一种明显的认知失调,即零的真正含义是"完全没有"。我将其建模为 2 个字段,一个名为
retentionPeriod
的枚举只允许 2 个值:"永久"和"年份",还有一个单独的字段可能retentionValue
来存储表示年份的整数。如果你最终输掉了与后端开发人员的争论,我至少认为魔术值应该是-1,意味着永远而不是0。(我也认为null
匹配"完全不"比"永远"更多,这就是为什么我认为-1是糟糕的魔术选项中最不坏的。至少在这方面有一些先例(
在您的特定情况下,我认为您的一个 UI 下拉列表将控制retentionPeriod
,另一个将控制retentionValue
。但我这样做的理由不是因为它碰巧以直接的方式与您当前的 UI 实现配对(这更像是一个令人高兴的巧合(,而是因为它更清晰地表示数据。
也就是说,根据我的经验,这个特定的例子在糟糕方面相当温和。我会更强烈地担心数组与对象的错误选择、模糊或混乱的命名、巨大的数据结构、过于健谈的 API 等。
- 如何更改bigquery API中的计费层选项
- Amazon S3 REST API大小不正确
- 客户端服务器REST API captcha实现
- 使用Facebook live API创建实时视频对象时的隐私设置
- 谷歌放置API:按国家或餐馆名称搜索餐馆
- MeteorJS:在带有回调的vzaar api上正确使用wrapAsync
- 是否可以控制获取哪些Google地图脚本(JavaScript API)
- API密钥使用和检查示例
- 谷歌地图API v3不适用于移动浏览器或PhoneGap
- 任何方式使AJAX调用Gmail API,而无需通过JS库
- 谷歌地图JS API+JSON-多个标记没有显示
- 单击超链接时,如何使用Google Maps API v3缩放地图
- 如何在 API 调用后和 if 语句中启用提交按钮
- 与运行长作业(javascript,node.js)的第三方API同步的最佳实践
- 搜索api在mac上显示对话框
- 用于构建 AngularJS 应用程序的正确 API 架构
- 具有REST API架构的单页应用程序
- Javascript BlueBird Promises:并发API请求的架构
- google translate api v2是RESTful架构吗?
- jQuery API 架构选择:为什么为 attr(), val(), .. 返回单个值而不是数组