最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

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:171102
用户头像

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

关注

评论

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

浅谈低代码技术在物流运输平台中的搭建与管理

王平

议程速递 | 7月27日分论坛议程一览

kk-OSC

开源 开放原子全球开源峰会

SAP ABAP 守护进程的实现方式

Jerry Wang

操作系统 守护进程 SAP abap 7月月更

一文辨析 Java、JSP、JavaScript

攻城狮杰森

Java JavaScript jsp 7月月更

开放原子开源基金会OpenHarmony工作委员会主席侯培新寄语OpenAtom OpenHarmony分论坛

OpenHarmony开发者

OpenHarmony

元宇宙GameFi链游系统开发NFT技术

薇電13242772558

NFT 元宇宙 链游

Python图像处理丨两种实现图像形态学转化运算

华为云开发者联盟

Python 人工智能 图像处理 图像

web前端开发培训课程如何学习

小谷哥

期待已久的 RocketMQ Summit 等待你的参与!

阿里巴巴云原生

Apache 阿里云 RocketMQ 云原生 消息队列

Linux 常用命令(二)

五分钟学大数据

Linux 7月月更

后端服务性能测试能力建设101

RingCentral铃盛

typescript 后端 ansible node,js SDET

2022首发!全网最详细深入剖析Java虚拟机文档(源码实例详解)

了不起的程序猿

Java JVM java程序员 Java 开发

一文详解Nodejs中fs文件模块与path路径模块

timerring

node.js path FS 签约计划第三季

JAVA编程规范之ORM 映射

源字节1号

后端技术

大咖观点+500强案例,软件团队应该这样提升研发效能!

万事ONES

向日葵资深产品总监技术分享:如何在AD域环境下应用

贝锐

安全 AD域 远程控制 向日葵

SAP ABAP Netweaver 容器化的一些前沿性研究工作分享

Jerry Wang

SAP abap Netweaver Docker 镜像 7月月更

Okaleido生态核心权益OKA,尽在聚变Mining模式

小哈区块

7月27日19:30直播预告:HarmonyOS3及华为全场景新品发布会

HarmonyOS开发者

HarmonyOS

Happens-Before原则深入解读

转转技术团队

Java JVM java 并发

10 个 Reduce 常用“奇技淫巧”

掘金安东尼

JavaScript 前端 7月月更

Python 高阶

Damon

7月月更

程序员培训学习后好找工作吗?

小谷哥

社区点赞业务缓存设计优化探索

得物技术

缓存 后端 重构 方案设计

武林头条-建站小能手争霸赛

hum建应用专家

数据库 wordpass

Flink 在 讯飞 AI 营销业务的实时数据分析实践

Apache Flink

大数据 flink 编程 流计算 实时计算

智能合约dapp系统开发流程技术

开发微hkkf5566

微服务化解决文库下载业务问题实践

百度Geek说

Java 微服务

Python爬虫,JS逆向之 webpack 打包站点原理与实战

梦想橡皮擦

Python 爬虫 7月月更

数据中台建设(二):数据中台简单介绍

Lansonli

数据中台 7月月更

基于 Flink CDC 实现海量数据的实时同步和转换

Apache Flink

大数据 flink 编程 流计算 实时计算

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