写点什么

创建 RESTful 服务,有 GET 和 POST 足矣?

  • 2010-06-24
  • 本文字数:1487 字

    阅读完需:约 5 分钟

Mike Amundsen在一篇博文中探讨了在仅限于使用 GET 和 POST 的环境中如何开发 RESTFul 的服务。

当我每次与人谈到 REST 架构风格时,人们给我的印象都是,除非使用 PUT DELETE 这两个 HTTP 方法,不然你的应用就不能算是 RESTful 的。这是不对的。

为了解释该问题,他转而回答了几个小问题,并通过它们证明,只要针对正确的操作使用了正确的 HTTP 方法,服务就是 RESTful 的。

操作是否安全?

他反复地说,代理通过检查 HTTP 方法来判断操作的安全性。只要通过 HTTP 方法表达的操作的目的与该操作的实现保持一致,操作就是安全的。

在实现中不要使用安全方法(如 GET HEAD )进行不安全的操作(如,写数据),这点非常重要。[……] 因为 HTTP 将 GET 定义为“安全的”操作,所以缓存(Cache)和其他代理就会(基于 HTTP 规范)理所当然地认为对相应的 URI 执行“预取(pre-fetch)”、或根据需要缓存响应并重播这些响应(replay the responses)是没有问题的。

POST 不够吗?对于不安全的操作,我们是否需要 PUT 和 DELETE?

虽然在这个问题上,许多示例和文章都建议这么做(也就是使用 PUT 和 DELETE),但是他强调了 RESTful 的服务接口不应该总是 CRUD 接口。

[……] 另一普遍观念是仅仅使用 POST 去执行所有操作不算 RESTful。换言之,除非你使用了 PUT 和 / 或 DELETE,不然你就不能称你的实现是支持 REST 的。这个错误的假设往往是仅通过 CRUD 操作的透镜去看 REST 所得到的副产品,即 REST== HTTP 之上的 CRUD。还是那句话,虽然可以在 HTTP 之上实现 CRUD,但它不是 REST,只是 HTTP 之上的 CRUD。

他继续搬出了 Roy Fielding 的在博客中说的话,“用 POST 是没问题的。

我们没有必要对于每次 HTTP 中的状态修改都使用 PUT。REST 从来没有要求我们应该这么做。

但是,只有 GET 和 POST 真能做任何事情吗?

当然可以”,他说道,“很多年来一直是这么做的,并不需要什么神奇的玩意儿。不需要特别的 HTTP 头;不需要在 URI 中指定动作;不需要在消息体中设置方法参数”。接着,它给出了在某服务器上的操作队列的示例。

例如,暴露公共资源,客户端通过请求(Request)向服务端提交数据,请求被加入到一个列表中等待处理:

复制代码
POST /users/pending-updates/
POST /users/pending-deletes/

该模型与 Tim Bray 在 Sun 的 VM API(Tim 称之为 Slow REST )的设计中的用到的思想非常相似。该思想来源于 Craig McLanahan 的关于处理异步操作请求的建议书。

对于任何或所有的 PUT/POST/DELETE 操作,我们返回“202 进行中 (In progress)”和一个新的“状态(Status)”资源,该资源包含,一个 0 至 100 的进度标识 (progress);一个指定操作作用对象的 target_uri;一个指定操作的 op;以及当 progress 达到 100 时,指代应用程序返回结果的 status 和 message 域。其思想是提供一个钩子供实现者进行低廉的轮询。

Mike 在他的帖子中这样结尾,当 HTTP 方法的使用受到网络的限制,或者受到客户端的用户代理的限制而不能使用除标准的 GET 和 POST 之外的其他动词(如 PUT 和 DELETE)时,服务应该作出调整,并将客户引导到正确的表象、HTTP 方法和 URI。

由于 HTTP 将交互抽象成资源和通过URI寻址的表象,所以作出运行时的调整非但可以,而且协议在设计时就考虑了这点。通过这些层次的抽象以及在 Fielding 的论文中描述的超媒体的限制(hypermedia constraint),你就能得到一个非常灵活的实现,不仅符合 HTTP 规范,而且能跨多种环境(甚至包括限用 GET 和 POST 的环境)支持 REST 架构风格的关键原则。

您的见解呢?请一定在此处或在原帖中发表出来。

查看英文原文 Are GET And POST Enough To Create RESTful Services?

2010-06-24 12:597701
用户头像

发布了 184 篇内容, 共 73.4 次阅读, 收获喜欢 6 次。

关注

评论

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

理论+算法+实战,教你如何实现亿级流量下的分布式限流

华为云开发者联盟

高并发 服务器 分布式限流 限流 计数器

【等保测评】广西等保安全测评有限公司有哪些?

行云管家

网络安全 广西 等保 等级保护 等级测评

让工程师拥有一台“超级”计算机——字节跳动客户端编译加速方案

字节跳动终端技术

ios 字节跳动 DevOps 客户端 火山引擎MARS

如何编写sdk?

百度Geek说

前端

填问卷赢豪礼,吐槽 NGINX 顺便中个 AirPods 新款耳机~

InfoQ写作社区官方

nginx 热门活动

分布式进阶(二十三):Nginx 服务器应用详解

No Silver Bullet

nginx https 正向代理与反向代理 SSL证书 2月月更

阿里云EMAS 1月产品动态

移动研发平台EMAS

阿里云 程序人生 移动开发 #EMAS

火山引擎科技原力峰会:超视频时代如何提供交互性、高清化音视频体验

字节跳动视频云技术团队

喜报 | 旺链科技入选上海市高新技术成果转化项目!

旺链科技

区块链 产业区块链 高新技术

java培训:JVM性能调优理论基础知识分享

@零度

JVM JAVA开发

LiveVideoStackCon | 面向在线教育业务的流媒体分发演进

有道技术团队

音视频

Camtasia卡点相册视频教程

淋雨

Camtasia 录屏软件

第二期 OceanBase 技术征文大赛来袭!快来释放你的原力!

OceanBase 数据库

数据库 分布式 征文大赛 OceanBase 社区版

冬奥金牌冲击!为冬奥助力加油!

InfoQ写作社区官方

话题讨论 冬奥会 热门活动

springboot3+r2dbc——响应式编程实践

麒思妙想

Reactive Java web spring-boot

OpenHarmony移植案例:如何适配服务启动引导部件bootstrap_lite

华为云开发者联盟

开发板 OpenHarmony startup子系统 bootstrap_lite

利用鸿蒙JavaUI 框架的 WebView 加载本地冰墩墩网页

宇宙之一粟

鸿蒙开发 2月月更

“翻墙”的罪与罚,国内互联网用户VPN“翻墙”的AB面

科技热闻

凡泰极客积极参与信通院“5G消息应用数据安全标准”落地工作

FinClip

5G消息 中国信通院

灵活地横向扩展:从文件系统到分布式文件系统

博文视点Broadview

低代码OR零代码,企业如何选择自身所需的软件开发平台?

WorkPlus

绿色数据中心:风冷GPU服务器和水冷GPU服务器综合分析

蓝海大脑GPU

用户体验超好的堡垒机哪里有?咨询电话多少?

行云管家

等保 堡垒机 网路安全 等级保护

2022年了循环是什么?

謓泽

循环语句 C'语言 2月月更

手把手教你使用HarmonyOS本地模拟器

HarmonyOS开发者

HarmonyOS DevEco Studio

数蛙科技百亿级物流标签轨迹时序数据压测

dgiot

物联网 2月月更 2月日更 dgiot dgiot物联网

如何通过云效进行函数计算(FC)发布

阿里云云效

阿里云 云原生 CI/CD 持续交付 研发提效

[架构实战营]第七模块

Vincent

「架构实战营」

各项结果排名第一!百度内容技术架构团队在国际向量检索大赛BigANN中斩获佳绩

百度Geek说

百度 内容 前端 后端

MySQL 是如何实现RC事务隔离级别的

华为云开发者联盟

MySQL ReadView 事务隔离 RC事务隔离 Read Committed

延迟任务场景,该如何提高吞吐量和时效性

华为云开发者联盟

redis 延迟任务 低延迟 Redis 消费队列

创建RESTful服务,有GET和POST足矣?_SOA_Dilip Krishnan_InfoQ精选文章