确定。我在几个地方读过多次使用相同的PUT URL会产生相同的效果。将数据输入Api / Student / 1234应创建或更新ID为1234的同一学生。
现在每个Url都会拥有需要在数据库中添加或更新的实际学生数据的有效负载。为什么ID不是有效载荷的一部分?我可以使用包含ID的有效负载简单地将数据PUT到Api / Student。
你会说Url不是幂等的。我的问题是如何使PUT url成为幂等的?我知道GET必须是幂等的。但是为什么PUT需要是幂等的,因为客户端是放置数据的人。使用包含相同学生ID的有效负载调用相同的URL Api / Student每次都会产生相同的效果。那么目的就解决了吗?
请帮忙。
答案 0 :(得分:2)
您需要在URI中使用id才能使缓存代理正常运行。如果你这样做
PUT /Api/Student/23
中间缓存知道它正在存储的/Api/student/23
的任何副本现在已过期,并且可以从缓存中刷新。如果您没有使用ID唯一标识资源,那么GET也是如此,那么缓存将无法独立存储该资源表示。
如果您遵循逻辑极限的论证,那么您可以说您在URI中不需要学生,因为该信息可以保存在有效载荷中。而且你是绝对正确的,它是一种有效的方法,它就是那时的REST。 REST统一接口约束包括“资源标识”作为子约束之一。
答案 1 :(得分:1)
根据REST架构,您可以使用PUT创建新资源,使用POST来更新现有资源。来源:http://en.wikipedia.org/wiki/Representational_State_Transfer,搜索PUT。
在Api / Student / 1234上调用PUT意味着您要创建ID为1234的学生。“多次PUT URL应具有相同的效果”;是的,但效果是重新创造那个学生,而不是第二次更新,所以它就像你说的那样是幂等的。但是就这样。
你真的试图提出PUT请求吗?你熟悉它是如何工作的吗?我会给你一个提示:如果你需要,可以使用json编码(这样你就可以发送文本和二进制数据)。
答案 2 :(得分:1)
PUT需要是幂等的原因是客户知道如果网络层出现问题(例如,无线网络的随机断开连接)或用户导航,客户端可以重复PUT而不询问用户。这是幂等的;完成它的次数并不重要(好吧,只要它完成至少一次)。这意味着PUT匹配的是创建特定资源,或设置特定资源的属性。
如果对/Api/Student/1234
进行PUT,则表示您正在使用该特定学生记录。如果您对/Api/Student
进行了PUT,那么您正在使用所有学生记录进行批量更新。是的,理论上你也可以允许选择更新,它没有良好的建筑气味。编码路径中资源的命名。 (如果你想创建一个你还不知道名字的新资源,当然要使用POST。)