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

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

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

关注

评论

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

GitHub爆赞,啃完这份500多页Java多线程笔记,阿里入职在望

程序员万金游

#java #程序员 #学习 #并发 #多线程

Python 集合(Sets)2

小万哥

Python 程序员 软件 后端 开发

【评测有奖】参加 SAE 2.0 产品评测,赢 Airpods 2 大奖!

阿里巴巴云原生

阿里云 Serverless 云原生

软件开发人员 Kubernetes 入门指南|Part 2

SEAL安全

软件开发 kubernetes 运维 企业号10月PK榜

运营SOP,高效运营的核心打法

用友BIP

数智营销

蓝易云:linux iptables安全技术与防火墙

百度搜索:蓝易云

云计算 Linux iptables 云服务器

CSS小技巧之绘制心形图案

南城FE

CSS css3 前端 心形

交易所开发(海外版)/交易所系统开发(案例详细)/交易所系统源码及demo

V\TG【ch3nguang】

Linux和UNIX的关系及区别

二哈侠

GTD任务管理器Omnifocus Pro 3,合理规划自己的时间

展初云

Mac GTD 待办记事软件

语音识别技术:从传统到现代的飞跃

来自四九城儿

DevEco Hvigor高效编译,构建过程新秘籍

HarmonyOS开发者

HarmonyOS

Mac平台视频后期合成和特效制作软件:Nuke 15

展初云

Mac Mac软件 视频后期制作 nuke

不同MBTI的HR是怎样做招聘的?

用友BIP

数智招聘

语音识别技术的优化与发展趋势

来自四九城儿

全网最细-深度解析 Istio Ambient Mesh 流量路径

阿里巴巴云原生

阿里云 云原生 服务网格

蓝易云:SSD固态硬盘和HDD机械硬盘服务器区别

百度搜索:蓝易云

Linux 运维 SSD 云服务器 HDD

Swap去中心化交易所/系统开发技术/Swap智能合约交易所源码搭建

V\TG【ch3nguang】

哪家强?Bitget Wallet vs Metamask 从安全性能角度全方位 PK

股市老人

文心一言 VS 讯飞星火 VS chatgpt (111)-- 算法导论10.2 2题

福大大架构师每日一题

福大大架构师每日一题

合约跟单/永续合约系统开发/交割合约/现货交易/Python技术编写

V\TG【ch3nguang】

基于 ACK Fluid 的混合云优化数据访问(五):自动化跨区域中心数据分发

阿里巴巴云原生

阿里云 云原生 ACK

Mac具有AI技术的创意图像编辑器Luminar Neo

展初云

Mac软件 AI技术图像编辑 图像编辑工具

合约跟单系统开发/跟单量化交易机器人/合约交易技术开发详情

V\TG【ch3nguang】

BigTime会是链游新的领航员吗?

币离海

财务共享中心的人员如何进行“选、育、用、留”?

用友BIP

财务共享

简洁的看图软件 XnViewMP激活中文最新版

胖墩儿不胖y

Mac软件 看图软件 图像编辑器

合约跟单/交易所开发方案,合约跟单/交易所系统dapp开发(稳定版)丨源码规则详细

V\TG【ch3nguang】

合约量化/现货交易/合约跟单/秒合约/系统开发技术分析

V\TG【ch3nguang】

数字时代的自我呈现:探索个人形象打造的创新工具——FaceChain深度学习模型工具

汀丶人工智能

人工智能 计算机视觉 图像生成

文本快速输入工具 Rocket Typist pro最新激活版

mac大玩家j

Mac软件 文本输入工具

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