AICon上海|与字节、阿里、腾讯等企业共同探索Agent 时代的落地应用 了解详情
写点什么

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

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

关注

评论

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

【Python实战】Python对中国500强排行榜数据进行可视化分析

BROKEN

三周年连更

使用 Kubectl Patch 命令更新资源

Se7en

云原生

重构这件“小”事儿 | 得物技术

得物技术

百度平地起“雷”,突然爆出的QPS数据意味着什么?

脑极体

大模型

2023 最新版 Java 面试八股文大全 PDF 版限时分享,含 700 道高频面试题

三十而立

为什么医疗保健需要MFT来帮助保护EHR文件传输

镭速

Cloud Kernel SIG月度动态:发布 Anolis 8.8 镜像、kABI 社区共建流程

OpenAnolis小助手

镜像 龙蜥社区 sig kernel 月报

【已结束】直播预告|传统 PvE 游戏 ∕ 开房间 PvP 游戏的云原生架构升级

阿里巴巴云原生

阿里云 云原生 游戏

2023年3月用户体验GX评测:国有行及股份行持续领跑,城商行及农商行农信社积极探索实践用户体验体系搭建

易观分析

金融 银行

【深入浅出Spring原理及实战】「源码调试分析」深入源码探索Spring底层框架的的refresh方法所出现的问题和异常

码界西柚

spring NPE 源码剖析 4月日更 问题分析

CorelDRAW2023发布!详解七大新功能

茶色酒

CorelDraw2023

CorelDRAW Graphics Suite2023最新中文版下载

茶色酒

cdr2023

预训练对话大模型深度解读

轻口味

AI 大模型 三周年连更

算法刷题-移除元素、分数到小数、整数转罗马数字

共饮一杯无

数据结构 算法 三周年连更

基于容器平台 ACK 快速搭建 Stable Diffusion

阿里巴巴云原生

阿里云 云原生 容器服务

当⻉借⼒阿⾥云落地云原⽣架构转型,运维降本、效率稳定性双升

阿里巴巴云原生

阿里云 云原生 云原生架构

Django笔记十五之in查询及date日期相关过滤操作

Hunter熊

Python django 日期

基于 Amazon SageMaker 构建细粒度情感分析应用

亚马逊云科技 (Amazon Web Services)

机器学习 Amazon SageMaker

CDR2023最新中文版下载安装详细教程

茶色酒

cdr2023

iMazing软件最新版有哪些新功能?

茶色酒

imazing

Tuxera NTFS2024免费版NTFS磁盘读写软件

茶色酒

Tuxera NTFS2024

各行业常见的业务指标汇总(数据分析常用数据指标)

Data 探险实验室

数据分析 数据分析师 数据指标 指标中台; 数据分析 指标洞察

Docgeni 2.1 正式发布

PingCode研发中心

软件开发 Docgeni

新手如何学好Zbrush3D建模?

Finovy Cloud

3D软件

Sibelius2023免费版音乐制谱软件

茶色酒

Sibelius2023

ChatGPT辅助编写自动化测试

QE_LAB

单元测试 自动化测试 接口测试 测试技术 ChatGPT

今天,飞桨公众号六岁啦!

飞桨PaddlePaddle

飞桨PaddlePaddle

TypeScript Module

程序员海军

三周年连更

世界读书日|华为阅读联合40余家伙伴推出精品书单

最新动态

CnosDB成为首个支持sqllogictest的时序数据库,稳定性与可靠性再升级

CnosDB

数据库 开源 时序数据库 CnosDB

活动回顾|微服务x容器开源开发者 Meetup 成都站回放 & PPT 下载

阿里巴巴云原生

阿里云 开源 容器 微服务 云原生

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