REST更新子对象 - 防止Id字段从更改

时间:2013-03-28 14:54:12

标签: rest put

假设我有以下对象图,客户端可以在HTTP PUT请求中提交以更新我的父对象

{
  "Id": 123,
  "FirstName": "Joe",
  "LastName": "Smith",
  "Schools": [
    {
      "Id": 444,
      "Name": "Fun University"
    },
    {
      "Id": 555,
      "Name": "Unfun University"
    }
  ]
}

在我的服务中,更新学校的唯一方法是通过学生。但是,我不一定能阻止客户端修改“444”ID。

我的问题是: 1.在服务器上验证id为444的学校是否属于id为123的学生是否足够安全? 2.或者,我的客户是否需要使用学生服务请求学生,然后使用学生服务中的学校列表,拨打学校服务(我创建)并在那里进行PUT? / p>

在方案1中,我将使用http://www.mydomain.com/api/students/123(PUT)更新整个对象。

在方案2中,我只使用http://www.mydomain.com/api/schools/444(PUT)

更新学校对象

截至目前,我的意图是#1,但这不是一个好方法吗?

1 个答案:

答案 0 :(得分:2)

足够安全......

仅在服务器上验证id为444的学校属于id为123的学生

为什么要检查依赖关系?
如果你只是编辑一所学校,这对学生资源没有任何兴趣。

只需发出您的PUT /student/123/school/444即可处理。如果您的客户有更直接的访问权限,请将/school/{ID}实施为新服务。

我认为你真正需要的是ID-not-changeable constraint。 只是禁止任何用户通过put请求更改资源的ID。只需要很少改变ID,并且应该特别小心处理,因为其含义(必须更新所有学生的关系)。

不应允许PUT /students/123改变学校本身,而只允许学生与他们建立关系(将他们从学生中移除或添加新的附加内容)。
您处理此问题的代码完全取决于您。