写点什么

GOTO Berlin: Web API 设计原则

  • 2013-10-22
  • 本文字数:1402 字

    阅读完需:约 5 分钟

在邮件列表和讨论区中有很多与 REST Web API 相关的讨论,下面仅是我个人对这些问题的一些见解,并没有绝对的真理,InnoQ 的首席顾问 Oliver Wolf GOTO Berlin 大会上开始自己的演讲“Web API 设计原则”时如是说。

不要考虑端点。 SOAP 有一个单独入口点的外观。相比之下 Web 有很多入口点,它们建立在关系上,彼此之间相互连接,并且以超媒体作为关键要素。为了不让你的 API 成为一个只有一种接入方式的黑洞,你应该使用超媒体控制按照对听众有意义的表现方式去链接你的资源。

** 不要在API中暴露领域模型。** 在很多模型中存在的一个问题便是它们仅包含数据,缺乏所有形式的行为,也就是所谓的贫血模型(anaemic model)。如果你暴露这样一个模型,那么最终将会成为 CRUD (创建、读取、更新和删除)和资源。这并不一定是一件坏事,有时你所需要的所有内容便是一个纯粹的 CRUD API。否则暴露一个 CRUD 模型的问题便是,使用这样一个 API 的客户端需要了解很多知识,清楚它能够对哪些资源执行什么操作,按照什么样的顺序执行等等这些内容。大量的逻辑需要编码在客户端中,使得客户端和服务器之间变得紧耦合。

** 目的明确之后再设计API。** 想想你的客户端想要做什么,如何做。有时这需要在清晰度和灵活性之间权衡,你需要多么简单清晰的 API,需要什么程度的灵活性。一种灵活但是也更加迫切的获取最有利可图的客户的方式是:

复制代码
GET /customers?sortBy=grossmargin&order=descending

相比之下,下面是一种声明意味更浓的暴露意图的方式,但是也缺乏灵活性:

复制代码
GET /most_profitable_customers

Oliver 提到这里需要注意的一点是,考虑一下客户端需要使用你的 API 做什么,它的意图应该是什么,并尽量让它完美契合这些需要。

** 不要过度使用GETPOST。** 这基本上意味着你不应该按照错误的方式使用它们,也不能违反 HTTP 规范。例如,你不应该使用 GET 或者 POST 删除资源。每个 HTTP 动词的产生都有各自的原因,它们之间是互补的,通过拥抱规范你得到的将会更多。使用动词传达目的,客户端想要做什么,它们期望从服务器得到哪些行为。

** 不要将错误码的选择限制为200500。** 使用完整范围的错误码,有 160 个错误码供你选择,所以几乎每一种类型的错误都有一个对应的错误码。使用正确的错误码是客户端能够合理处理错误的关键。一个常见的问题是,尽管发生了一个错误但是服务器依然返回 200,OK。在这种事情发生时假装所有事情运行良好显然不是一个很好的想法。

不要忽略缓存。 无论涉及到什么都会有缓存,它是 Web 的一个非常重要的部分。如果你不想使用缓存,那么通过添加合适的缓存头明确地关闭它。
一种比较好的控制缓存的方式是使用验证器,最好是 Etags。它们允许服务器端操作任意的数据,一个 Etag 仅仅是服务器生成并传入缓存的一个值,然后缓存会将其传回以询问服务器是否有更新的资源。

不需要版本。通常情况下,当资源发生变化的时候实际上它仅仅是展示发生了改变,而它依然是那个资源,应该使用同一个 URL,因此避免将 URL 版本化。相反的,应该有一个新版本的媒体类型,例如通过下面的方式添加版本 v2:

复制代码
Content-Type=application/vnd.company.v2+xml

不要对内容协商使用扩展。协商一种表现格式的正确方法是在消息头中使用 Accept 和 Content-Type。

2013 年的 GOTO Berlin 大会是 GOTO 大会首次在 Berlin 举行,本次大会有超过 400 位参会者和大约 80 位讲师。

查看英文原文 GOTO Berlin: DO’s and DON’Ts in a Web API

2013-10-22 03:472931
用户头像

发布了 321 篇内容, 共 122.0 次阅读, 收获喜欢 19 次。

关注

评论

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

惊!阿里大佬珍之若宝的最强高并发pdf,竟然被上传GitHub开源

Java 编程 架构 面试 程序人生

如何支持亿级用户分流实验?AB实验平台在爱奇艺的实践

爱奇艺技术产品团队

测试 开发 精准测试 AB testing实战

终于有人把操作系统,CPU,基础知识,网络一次讲清楚了,绝绝子

Java~~~

Java 架构 面试 TCP 网络

使用接口文档快照机制,让接口文档不在频繁变动

CodeNongXiaoW

大前端 测试 后端 接口文档

算法推荐规制!《互联网信息服务算法推荐管理规定(征求意见稿)》公开征求意见

郑州埃文科技

深层剖析鸿蒙轻内核M核的动态内存如何支持多段非连续性内存

华为云开发者联盟

鸿蒙 内存 结构体 OpenHarmony 动态内容

Go- map的定义

HelloBug

Go 语言 map的定义

Go- map的使用

HelloBug

Go 语言 map的使用

【墨天轮专访第二期】巨杉数据库萧少聪:重视企业长期需求,打造中国的世界级产品

墨天轮

数据库 人物访谈 国产数据库 巨杉数据库

阿里内部推出Spring响应式微服务Boot2Cloud文档

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

超实用?HUAWEI高工总结出15W字的图解计算机操作系统指南手册

Java~~~

Java 架构 面试 TCP 网络

基于 Formily 的表单设计器实现原理分析 ​

全象云低代码

JavaScript 低代码开发 表单设计

这一次!我在百度告诉你,当你请求百度时都发生了什么...

程序员 架构 面试 计算机

面试侃集合之SynchronousQueue非公平模式篇

码农参上

非公平锁 SynchronousQueue 8月日更

金九银十给我疯狂内卷!GitHub再现星标86K面试手册,37K!妥妥的

Java~~~

Java 架构 面试 算法 JVM

Spark必读!总有一些Spark知识点你需要知道

Qunar技术沙龙

spark hdfs mapreduce Web UI 数据倾斜

eKuiper 联手 OpenYurt,解决物联网场景下边缘流数据处理难题

EMQ映云科技

云计算 阿里云 物联网 IoT #Kubernetes#

今天我们来谈谈Golang的同步等待组

Regan Yue

Go 语言 8月日更 同步等待组

阿里P8大牛终于整理完了564页大话java性能优化神仙文档

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

阿里P8大牛耗费三年整理的:Java架构之完美设计实战PDF

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

字节再次出圈!GitHub上爆火一星期的算法刷题手册竟出自这人之手

Java~~~

Java 架构 面试 算法 数据结构与算法

Alibaba新产!Spring+SpringBoot+SpringCloud全家桶进阶小册

Java~~~

Java spring 架构 面试 Spring Cloud

Shopee物流业务核心数据库架构演变——权衡取舍的艺术

Shopee技术团队

架构 #数据库 #物流 #供应链 #Shopee

比POSTMAN更好用!在国产接口调试工具APIPOST中使用Mock

Proud lion

大前端 后端 Postman 开发工具 接口文档

疫情小区离你有多远,百度地图告诉你

百度开发者中心

最佳实践 百度地图

膜拜!阿里内部都在强力进阶学习springboot实战派文档

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

堡垒机和防火墙的三大区别分析-行云管家

行云管家

网络安全 防火墙 信息安全 数据安全 堡垒机

保姆级教程,小白也能2周搞定3个月的Web开发任务!

博文视点Broadview

模块六作业

燕燕 yen yen

架构实战营

带你读AI论文丨LaneNet基于实体分割的端到端车道线检测

华为云开发者联盟

端到端 网络模型 车道线 实体分割 LanNet

常用正则表达式最强汇总(含Python代码举例讲解+爬虫实战)

Python研究者

8月日更

GOTO Berlin: Web API设计原则_SOA_Jan Stenberg_InfoQ精选文章