我正在创建一个Android应用程序,该应用程序调用基于PHP的REST API方法进行服务器端更新。
例如,要向客户添加奖励积分,我们可以使用:
http://example.com/rest/customer/add/1/20
其中1是客户ID,20是奖励积分。
我想知道如何防止对此网址的重复调用。如果由于某种原因,此URL被调用两次,则客户将获得20多个积分。没有这样的条件,客户不能在同一天获得更多积分。
另外,如何防止匿名执行此URL?
OAuth 2.0是最佳解决方案还是有更好的解决方案?
由于
答案 0 :(得分:0)
解决这个问题的REST / HTTP方法会使"有条件的" POST
请求奖励积分"资源。
对POST
20分的请求看起来像这样:
POST /customer/1/points HTTP/1.1
If-Match: "0"
Host: ...
20
If-Match
标头意味着POST
只应在您尝试修改的资源仍具有指定状态时才能完成。在这种情况下,如果客户有POST
分,则20分只会0
。它可以被认为是optimistic locking机制。
如果If-Match前提条件失败,服务器通常应该响应错误代码412(前提条件失败)。
注意:客户的要点应该是资源。
为防止未经授权访问点,您的服务器必须实现一些身份验证机制。如果用户未经过身份验证,最简单的方法是使用401(未授权)进行响应。如果用户通过身份验证,则无权更新某些点,返回403(禁止)。