我们有一个REST接口,允许客户端创建产品资源。产品可以与不同类型的元数据相关联。
/Product/{id}/metadata/{md_type}
团队希望特定类型的元数据只写入一次。应拒绝后续更新。
目前,PUT 请求用于创建元数据。未为元数据分配 ID。它是不可变的。如果元数据已存在,则 PUT 请求将被拒绝。
使用 PUT 感觉就像违反了 REST 语义。处理这种情况的最 RESTful 方法是什么?
使用 PUT 感觉就像违反了 REST 语义。处理这种情况的最 RESTful 方法是什么?
在这里使用 PUT 是完美的。
最简单的答案是,你错过了一个事实,即这是一个条件请求;如果客户端使用If-None-Match标头发送其请求,那么条件请求的所有通用处理都将"正常工作",如果资源已经有表示,服务器将返回412前提条件失败。
如果客户端不包含 If-None-Match 标头,那么我认为 412 不合适。 也许 405 方法不允许,或 409 冲突;403 禁止是有道理的,但可能会让那些认为必须涉及凭据问题的人类感到困惑。
拒绝后续 PAT 上的更新违反了 RESTful 接口最不意外的原则。
不,它没有。 由于PUT
定义并约束请求的语义,因此它不要求服务器完成请求。