REST API - 单个资源的更新会更改多个其他资源

时间:2016-03-02 23:53:44

标签: web-services api rest http http-status-codes

我正在寻找如何处理以下问题的方法:

想象一下,您修改资源,然后导致更新其他资源。

E.g。你发出一个PUT,比如#!/bin/bash compressor() { filepath="$1" process="${filepath%.*}" output="/Users/leftright/Desktop/Output/${process##*/}_PROCESSING/" filename="${filepath##*/}" moving="${output}""${filepath##*/}" cleanname="${filename%.*}" final= "${output}""${cleanname}".mp4 completed="/Users/leftright/Desktop/Output/${process##*/}_COMPLETED/${cleanname}.mp4" mkdir -m 777 "$output"; mv "$filepath" "$moving"; /Applications/Compressor.app/Contents/MacOS/Compressor -computergroup "This Computer" -jobpath "$output""$filename" -settingpath /Users/leftright/Documents/CONVERTHQTEST.cmprstng -locationpath "$final"; while true; do if lsof "$final" > /dev/null; then sleep 1 else mv "$final" "$completed" fi done } export -f compressor fswatch -0 -v --event Created /Users/leftright/Desktop/Watch | xargs -0 -n1 -I filepath bash -c 'compressor "filepath"' ,它根据定义改变给定用户的所有其他订单的状态。可能有UI客户端显示订单表,他们应该知道不仅表中的单个项目已更新,而且最终还是其他项目。

现在,有没有任何标准的方式告知客户这种情况?

到目前为止,我只能想到发回/api/orders/1234 HTTP状态代码来通知客户端他应该刷新状态,因为不只是一件事情发生了变化。

1 个答案:

答案 0 :(得分:1)

有多种解决方案。

  1. 您可以将特定资源定义为不可缓存,因此客户端根本不会缓存它们。 (no-store
  2. 您可以尝试提供0 max-age,因此客户端必须始终重新验证这些资源。在这种情况下,您可能必须实现ETag和条件GET,但它在服务器上比选项1更容易。
  3. 某些推送方法,如WebSockets
  4. 如果你真的想要"通知"可能是多个客户的变化,然后听起来你需要选项3。

    但是,正确配置的缓存通常足够好。例如,您可以将尚未执行的订单标记为未缓存(max-age = 0),但是一旦执行,您可能会将其标记为无限期缓存,因为它不能再更改。