写点什么

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

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

关注

评论

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

Topaz Video AI for mac(人工智能视频增强软件)v4.1.0激活版

iMac小白

2023年的技术总结和工作反思

梦笔生花

年终总结

Termius for Mac(SSH客户端)v8.4.0激活版

iMac小白

MSE Nacos:解决敏感配置的安全隐患

阿里巴巴云原生

阿里云 微服务 云原生 nacos

当 OpenTelemetry 遇上阿里云 Prometheus

阿里巴巴云原生

阿里云 云原生 可观测

服务器如何配置支持history模式

百度搜索:蓝易云

云计算 Linux 运维 云服务器 history

2023启示录丨我的大模型创业这一年

自象限

创业 #大模型

Macs Fan Control Pro for mac v1.5.16中文激活版下载

iMac小白

文心一言 VS 讯飞星火 VS chatgpt (183)-- 算法导论13.4 7题

福大大架构师每日一题

福大大架构师每日一题

阿里云 ACK 云原生 AI 套件中的分布式弹性训练实践

阿里巴巴云原生

阿里云 分布式 云原生

FlagData 2.0:全面、高效的大模型训练数据治理工具集

mr.well

NLP 大模型 LLM模型 #大模型

Nacos 在云原生架构下的演进

阿里巴巴云原生

阿里云 云原生 nacos

Navicat Premium 15 for Mac(数据库开发工具)v15.0.36中文激活版

iMac小白

CentOS 8上使用NVM安装特定版本的Node.js教程

百度搜索:蓝易云

Linux centos 运维 Node 云服务器

工作中常用到的java8相关操作总结

智慧源点

stream java8 LocalDateTime Optional

随想2024.01.21

hackstoic

精力管理

活动回顾丨阿里云云原生 Serverless 技术实践营西安站 PPT 下载

阿里巴巴云原生

阿里云 Serverless 云原生

阿里云 ACK One Serverless Argo 助力深势科技构建高效任务平台

阿里巴巴云原生

阿里云 云原生

为大模型工程提效,基于阿里云 ACK 的云原生 AI 工程化实践

阿里巴巴云原生

阿里云 AI 云原生

Microsoft Remote Desktop for Mac v10.9.5中文正式版下载

iMac小白

SecureCRT for mac(终端SSH工具)v9.3.2激活版

iMac小白

淘宝/天猫获取卖出的商品订单列表 API(taobao.seller_order_list)

技术冰糖葫芦

API

调研 7 个开源项目后,这家数据合规平台如何构建高性能网关

阿里巴巴云原生

阿里云 云原生

Seata 2.x 首个版本正式发布,支持 Raft 集群模式

阿里巴巴云原生

阿里云 云原生 seata

改变命运的抉择

少油少糖八分饱

小说 命运 东野圭吾 推理小说 悬疑

Nacos 2.3.0 正式版发布,Nacos Controller 项目开源

阿里巴巴云原生

阿里云 云原生 nacos

Lightroom Classic 2024 for Mac(LRC2024)v13.0.2中文激活版

iMac小白

MATLAB R2023b for Mac v23.2.0.2428915中文激活版

iMac小白

恭喜 Apache Dubbo 和 Nacos 荣获开放原子“2023年度生态开源项目”

阿里巴巴云原生

阿里云 开源 云原生

ubuntu系统如何查看已安装cudnn版本

百度搜索:蓝易云

Linux ubuntu 运维 云服务器 cudnn

MATLAB R2023a for Mac(商业数学软件)v9.14.0 (2337262)激活版

iMac小白

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