假设我正在创建RESTful接口,并且我想使用PUT
将资源上传到/resources/{id}
。但我只想上传以前没有上传过的东西。
我意识到PUT
应该是幂等的,所以如果我PUT
两次到相同的网址,它应该两次成功,对吗?
我也理解我可以在现有资源上使用HEAD
,然后在PUT
中使用use an ETag
以确保自上次检查后资源未被修改。
但是,如果事情尚不存在,我怎样才能确保我只上传一件东西?也就是说,我怎样才能确保我不会踩到别人的东西?
答案 0 :(得分:4)
我意识到PUT应该是幂等的,所以如果我把东西放两次 它应该在同一个URL上成功吗?
正确。
但是,如果事情没有,我怎么能确保我只上传一件东西 已经存在?也就是说,我怎样才能确保我不会踩到某人 别的什么?
不要使用HEAD电话。使用标题If-None-Match: *
进行PUT调用。这将指示服务器仅在没有当前实体时执行操作,详见RFC 2616第3段。
答案 1 :(得分:3)
请参阅http://greenbytes.de/tech/webdav/rfc7232.html#rfc.section.3.2.p.7:
" If-None-Match也可以使用值" *"防止不安全的请求方法(例如,PUT)在客户端认为资源没有当前表示时无意中修改目标资源的现有表示([RFC7231]的第4.2.1节)。这是"丢失更新的变体"如果多个客户端尝试为目标资源创建初始表示,则可能出现问题。"