写点什么

Kevin Montrose 谈 StackExchange API 的历史与错误

  • 2011-08-28
  • 本文字数:1158 字

    阅读完需:约 4 分钟

为现有站点创建公开 API 总是一件很有风险的事情,而且 StackExchange 的开放编辑策略则将这种风险更进了一步。在最近发表的一系列文章中,Kevin Montrose 谈到了关于 StackExchange API 的决策以及从中得到的经验与教训。

在开始设计 API 时,他们就已经设定好了目标与约束。比如说,他们的一个主要目标就是“让开发者无需查阅其站点”。StackExchange 成员所遵循的内容许可协定 cc-wiki 可以让第三方重用站点上的内容,但在该 API 发布前,并没有很好的方式进行批量访问。最大的一个约束在于 API 是只读的, Kevin 说到

显然,写操作是非常危险的。不仅仅出现在有 Bug 的认证上,比如有人以 Jeff Atwood 登录,删除了大量的内容,这会让我寝食难安。更重要的是(也是更危险的),在疏于指导的情况下,这会导致人们发布大量的垃圾信息。 我们为了确保 Stack Exchange 内容的质量付出了艰辛的努力(我们关闭了不满足标准的整个站点)。未经深思熟虑的写操作 API 会导致很多问题,因此我们在 1.0 中并没有将其添加进来。不过,我们有可能在 3.0 中将其添加进来。

Kevin 提到了一些关键的设计点:

  • 矢量化请求:“无论何时,如果我们能接受一个 id,那么我们就可以接受 100 个”
  • 压缩的响应:我们使用 GZIP 对响应进行压缩,即便客户端并没有要求压缩我们也会这么做
  • 排序与过滤:“大多数端点可以接收 sort、min、max、fromdate 以及 todate 参数进行查询”

但人们更感兴趣的是他们所犯的错误。比如说,默认情况下返回总数的决定。

总数对于分页控件的渲染很有用,count(*) 查询就是如此(比如说人们对我的评论的投票数等等);从这个角度来说,total 字段本身并没有错。但默认情况下返回它则毫无疑问是不对的。 问题在于总数是有用的,但却并非总是如此。很多时候,查询形式是这样的:“返回标记为 X 的最近的 N 个问题 / 答案 / 用户,或是返回你所拥有的前 N 个问题 / 答案并且根据 S 排序”。这些常见的查询与总数没有任何关系,但每次却都要返回总数,这就需要付出代价。

另一个问题在于对隐式类型的使用。相对于显式说明返回哪个数据类型来说,客户端开发者需要从现有的字段中进行推断。无论在何种语言中这都是非常恼人的问题,但对于静态类型语言来说更是如此,因为开发者需要将这些无名类型映射到实际的类上。

暂且不表其他的错误,让我们使用 Kevin 提到的最后一个错误来作为结论,那就是浪费的请求量。为了防止过度使用 API,他们使用了与 Twitter API 一样的配额。

这实在是太浪费带宽了,与 Twitter 不同,我们的配额还是相当慷慨的(每天 10,000 个请求)并且不是动态的。对于 total 字段来说,很多应用并不需要关注配额(除非超过了,但这种情况很少发生),但如果每次请求都获取该字段则需要付出代价。

查看英文原文: Kevin Montrose on the History and Mistakes of the StackExchange API

2011-08-28 09:171167
用户头像

发布了 88 篇内容, 共 262.0 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

阿里P8亲自教你!2021Android大厂面试知识分享,实战篇

欢喜学安卓

android 程序员 面试 移动开发

我用一个小小的开放设计题,干掉了40%的面试候选人

架构精进之路

Web 安全 软件设计 3月日更

使用 Flink 前需要知道的 10 个『陷阱』

Apache Flink

flink

百度×TCL丨鸿鹄语音芯片首次在家电行业量产!

百度大脑

百度 语音识别 百度大脑 智能家居 百度智能云

阿里P8手把手教你!万字Android技术类校招面试题汇总,附赠课程+题库

欢喜学安卓

android 程序员 面试 移动开发

首款微控制器级树莓派 Pico,超廉价只需4美元

不脱发的程序猿

树莓派 28天写作 3月日更 树莓派 Pico 微处理器

mysql 四种隔离级别

Sakura

28天写作 3月日更

全国大学生智能汽车竞赛-百度线下赛题发布!封狼居胥,等你来战!

百度大脑

人工智能 百度 比赛 飞桨 AI Studio

Python 中级知识之装饰器,滚雪球学 Python

梦想橡皮擦

28天写作 3月日更

有源晶振和无源晶振的区别

不脱发的程序猿

28天写作 电路设计 3月日更 晶振 元器件

HashData与HDFS的高效数据交换

酷克数据HashData

PostgreSQL高校数据库课程改革系列活动

PostgreSQLChina

数据库 postgresql 开源 软件 开源社区

有道 Kubernetes 容器API监控系统设计和实践

有道技术团队

Kubernetes 容器 分布式

Superset 兼容ADB(AnalyticDB-MySQL)

data_y

Python MySQL Apache Superset

什么是VXLAN?为什么需要VXLAN?

华为云开发者联盟

网络 虚拟化 VLAN VXLAN 报文

【LeetCode】 基本计算器 II Java题解

Albert

算法 LeetCode 28天写作 3月日更

JVM笔记 -- JVM经历了什么?

秦怀杂货店

Java JVM

带你全面认识CMMI V2.0(一)

IPD产品研发管理

项目管理 CMMI

Midway Serverless 发布 2.0,一体化让前端研发再次提效

Serverless Devs

Serverless 云原生 大前端

中国石油数字化转型提速 HashData助力梦想云建设

酷克数据HashData

对象存储与HashData多云战略

酷克数据HashData

助我拿到37KOffer,这份阿里巴巴890页Redis笔记可谓功不可没

Java架构追梦

Java redis 阿里巴巴 架构 面试

1500道算法面试题:Github上标星86.7K!直接火遍全网

比伯

Java 编程 程序员 架构 面试

makefile:带你了解一种常用于GNU gcc编译的工具语言

华为云开发者联盟

编译器 LiteOS makefile 语言 GNU

《她说》——我们自出版的第一本书

张凯峰

火爆!GitHub 标星 144k 的前后端学习路线

沉默王二

学习 后端

一文搞懂步进电机特性、原理及驱动器设计

不脱发的程序猿

硬件产品 28天写作 3月日更 步进电机 驱动电机

百度文心多项任务分数刷新GLUE榜单,NLP界的“MVP”再次夺冠

百度大脑

自然语言处理 百度 文心 ERNIE

Weblogic11g安装部署-winserver篇

xiezhr

中间件 Windows Server 3月日更 weblogic

夺命剪刀脚(死锁)

鲁米

方法论 死锁

马特量化交易机器人系统开发网格策略

薇電13242772558

Kevin Montrose谈StackExchange API的历史与错误_SOA_Jonathan Allen_InfoQ精选文章