首页 > 解决方案 > 为 REST 接口编写一次语义

问题描述

我们有一个允许客户端创建产品资源的 REST 接口。产品可以与不同类型的元数据相关联。

/产品/{id}/元数据/{md_type}

团队希望只写入一次特定类型的元数据。应拒绝后续更新。

目前,PUT 请求用于创建元数据。元数据未分配 ID。它是不可变的。如果元数据已存在,则拒绝 PUT 请求。

使用 PUT 感觉就像违反了 REST 语义。处理这种情况的最 RESTful 方式是什么?

标签: rest

解决方案


使用 PUT 感觉就像违反了 REST 语义。处理这种情况的最 RESTful 方式是什么?

在这里使用PUT是完美的。

最简单的答案是您错过了这是一个Conditional Request的事实;如果客户端要发送带有If-None-Match标头的请求,那么所有对条件请求的通用处理都将“正常工作”,如果资源已经具有表示,则服务器返回412 Precondition Failed 。

如果客户端不包含 If-None-Match 标头,那么我认为 412 不合适。可能是405 Method Not Allowed,或者409 Conflict403 Forbidden是正确的,但可能会使认为这必须涉及凭据问题的人感到困惑。

拒绝后续 PUT 的更新违反了 RESTful 接口的最小意外原则。

不,它没有。因为PUT定义和约束了请求的语义,它并不强制服务器完成请求。


推荐阅读