我遇到的情况是客户端应用程序可以请求匹配特定条件的资源,如果匹配的资源不存在,则会创建并缓存该资源。对相同条件的后续请求将返回缓存的资源。
我可以通过PUT请求实现这一点,以创建资源和后续GET。但是,在我的特定情况下,要求客户了解我的系统的内部工作情况,即客户端不应该关心资源是否已经存在。
因此,允许客户端发出创建资源的单个GET请求(如果资源尚不存在)是否可靠?
答案 0 :(得分:6)
理论上GET应该只是GET,而不是改变你的系统状态。请参阅idempotency。
维基百科的段落:
某些方法(例如,HEAD,GET,OPTIONS和TRACE)被定义为安全,这意味着它们仅用于信息检索,不应更改服务器的状态。
但是,在您的方案中,初始GET正在设置纯粹用于缓存的资源。后续调用不会改变系统的状态,所以我建议在这种情况下GET没问题。
答案 1 :(得分:3)
为此目的使用GET是绝对合适的;资源的“呈现”超出了客户端/服务器HTTP交互的范围,因此它是否“创建”无关紧要 - 这是统一接口之外的实现问题。
我所说的是对客户来说无关紧要 - 因为就其而言,请求是安全+幂等的。它不关心服务器是否正在创建一些内容,以便出于效率原因即时返回,或者它是否已经“存在”并且只是输出。
GET / resource?criteria1 = xyz& criteria2 = abc
答案 2 :(得分:1)
是的,如果创建资源的唯一目的是缓存它。 这样,您可以将系统视为已包含所有可能的GET结果,并且不会违反幂等性。机器如何获得结果(来自缓存或算法)并不重要,甚至无趣。
Richard Ev:如果你这么严格,你甚至无法将GET请求记录到服务器,因为日志记录是副作用并且会改变系统的状态。 编辑:我发现你不再那么严格,我同意: - )
答案 3 :(得分:0)
在获取某些数据时使用GET,并在更改某些状态时使用POST。
如果您使用GET更改某些状态,并且您的应用是通过互联网进行的,则搜索引擎抓取可能会对您的系统产生不良影响。
此外,浏览器会缓存GET请求,以便在数据更改频率较低的情况下节省一些带宽和服务器资源。