10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

什么时候 POSTing 状态合适?

  • 2009-04-23
  • 本文字数:1292 字

    阅读完需:约 4 分钟

一篇文章中, Tim Bray,审视了 Sun Cloud API 的第一版公众草稿所收到的反馈。 对于其中一些反馈他在文中作出了回应,对于如何对交互进行建模,例如以 RESTful 的方式创建一个 VM 集群,进行了探索。

他展示了在设计 Sun Cloud API 范畴中的几个场景,并问到用 POSTing 状态来建模这样的交互是否是一种合适的策略。

但你不是真正的在改变状态,你是在请求一系列特定动作的执行,作为其结果,该状态是否能获得期望的值皆有可能。实际上,当你触发部署开关,状态变为了部署中,在不可预知的一段时间之后,又改变为已部署。而重启操作这一经典例子,就是在机器旁边有一个红色的大开关,问题是如何按这个开关。

所以啊,我越想越觉得,这些资源就像是按钮,只有唯一定义的操作:按下。人们对于“只写资源”牢骚满腹,但我却觉得不存在什么问题,因为这非常准确。重启和停止按钮实际上没有任何状态,所以你不应该期待 GET 操作能得到什么有用的东西。

Bill de hóra 在 对这篇文章的回应中提供了例子,来说明 PUT 和 POST 两者何时相对于另一方来说更为合适。

什么时候 PUT 与 POST 的比较才真正有影响?据我所知,当你的资源代表着一个集合时,它是有影响的,而这也很普遍-文件夹,专辑列表,订阅种子,收集物,博客,标签云,订单,购物车-任何基于列表的结构。

他同时还展现了关于整个讨论更加实用的方面,并建议将 POSTting 表单作为一种可能的解决方案。

另一方面,很多很多人不会,不想,(有时候也不能)去关心 REST/HTTP/AtomPub 的秘密。所以我也考虑到我们需要模式和实践来帮助开发者上手。

但是到目前为止我并不确认在我们支持 REST 的社区阵营里对于部分的更新资源已经有了一个很好的普遍答案或是设计模式。除非是这样,不然我推测人们还是会回到使用表单 posting,因为它是最为简单和兼容的部署客户端库和 web 框架的方式。要不就这样。要不就为部分更新定义一些特定的媒体类型。

Roy Fielding 也对这篇文章作出了回应

在我的论文中没有特指的主要原因,是因为这些方法是作为 Web 架构定义的一部分,由 HTTP 来定义的,而不是 REST 架构风格(所定义的)。特定的方法定义 […] 对 REST 架构风格没有影响,所以对它们进行风格讨论非常困难。REST 对方法的唯一要求就是它们需要为所有的资源有着统一的定义 (例如,中介不必需要去了解资源的类型就可以理解请求的含义)。

只有当 POST 被用在有其它的方法理想适用的场合,才是一个问题。其它的方法对中介更有价值,因为它们说明了失效如何被自动处理以及中间缓存如何去优化它们的行为。POST 不具备这些特点,但这并不意味着我们离得开它。POST 在 HTTP 里为许多有用的目的而服务,包括主要目标:“这一行为不需要符合于标准。”

Roy 作出了总结:

我们没必要对于 HTTP 的每个状态改变都使用 PUT。REST 从没说过我们应该这样。[…] 我个人的话,对这些按钮我就使用 POST。API 可以对使用 POST 作出补偿,可以在响应中表示客户端应当刷新对更大资源状态的表象。换句话说,我会返回一个 303 响应,重定向回 VM 状态,这样客户端就知道状态已经改变了。

这里有原文, 以及社区的所作出的回应。

查看英文原文: When Is POSTing State Appropriate?

2009-04-23 02:531487
用户头像

发布了 133 篇内容, 共 42.8 次阅读, 收获喜欢 1 次。

关注

评论

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

JavaScript刷LeetCode模板技巧篇(一)

Geek_07a724

JavaScript LeetCode

蒙牛前数科部总监刘瑞宝分享蒙牛数字化转型成果-星策社区大咖说(一)

星策开源社区

决策 智能化转型 数据链路 蒙牛

Webpack中的plugin插件机制

Geek_02d948

webpack

JS词法环境和执行上下文

hellocoder2029

JavaScript

“程”风破浪的开发者|元宇宙给我们带来了哪些机会

石云升

区块链 元宇宙 10月月更 “程”风破浪的开发者

以太网数据链路层、Ethernet_II帧格式、IEEE802.3帧格式,以太网的MAC地址的组成,ARP地址解析协议的工作原理,单播帧、组播帧、广播帧的区别

Python-派大星

10月月更

融云直播SDK开路,给电商大促加点“魔法”

融云 RongCloud

直播 社交娱乐

Node.js实现大文件断点续传

coder2028

node.js

js裁剪(分隔)字符串常用方法

木偶

JavaScript 前端 10月月更

Internet协议栈 TCP/IP模型 、以太网封装以及解封装过程、物理层、链路层、网络层、传输层、应用层的作用 OSI七层模型

Python-派大星

10月月更

2022-webpack5实战教程

Geek_02d948

webpack

【开发利器Hutool】推荐一个超好用的本地缓存

JAVA旭阳

Java hutool 10月月更

“程”风破浪的开发者|C#下WPF中实现贪吃蛇小游戏(超详细步骤附带源码)

木偶

C# 学习方法 贪吃蛇 10月月更 “程”风破浪的开发者

C++中的四种类型转换

可口也可樂

c++ 类型转换 10月月更

Vue3必会技巧-自定义Hooks

yyds2026

Vue

一步一图带你深入理解 Linux 虚拟内存管理

bin的技术小屋

内存管理 Linux Kenel 虚拟内存

Linux网络-HTTP协议

可口也可樂

Linux 网络协议 HTTP 10月月更

大咖说·小码王|人工智能时代,如何让孩子掌握与机器交流的语言?

大咖说

人工智能 阿里云 降本增效

@程序猿:旺链科技惊喜已到,请速速查收~

旺链科技

区块链 产业区块链 1024程序员节 企业号十月PK榜

怎么购买公有云?具体流程是怎样?

行云管家

云计算 公有云 企业上云 云管理

TCP/IP协议中分包与重组原理介绍、分片偏移量的计算方法、IPv4报文格式

Python-派大星

10月月更

项目汇报复盘

Geek_XOXO

复盘 项目复盘

Nodejs+Redis实现简易消息队列

coder2028

node.js

调度线程池ScheduledThreadPoolExecutor的正确使用姿势

JAVA旭阳

Java 线程池 10月月更

算术四则混合运算表达式的求值

可口也可樂

算法 10月月更 四则运算

嵌入式 Linux 入门 环境篇(一、开发板初体验)

矜辰所致

Linux 开发板 启动流程 10月月更

Flowable 服务任务执行的三种方式

江南一点雨

Java spring springboot flowable JavaEE

JS知识点梳理之作用域、作用域链、柯里化、闭包

hellocoder2029

JavaScript

资源不准下的网络故障定位探索

鲸品堂

故障定位 企业号十月PK榜

Go Web 实战:如何创建项目及增加日志功能

宇宙之一粟

日志 Go web Go 语言 10月月更

我摊牌了!真正的灰度队列实现方案!全网你都搜不到!

艾小仙

Java kafka RabbitMQ 中间件 计算中间件

什么时候POSTing状态合适?_SOA_Dilip Krishnan_InfoQ精选文章