2013-02-15 67 views
2

比方说,我有一个FooEnity,其ID为35,由Web服务公开,位于/myhost/api/fooentity/35PATCH请求主体中的REST实体ID

现在我想实现一个PATCH调用,允许部分更新到FooEntity(所以我们假设25个可用字段中的2个被传递更新)。

我的问题是,如果PATCH内容(json/xml)包含35的id?实体的地址由URI指定,并且id不是可更新的字段,并且如果包含该字段,则需要额外验证以确保两个ID都匹配。所有这些建议。不过,它感觉很奇怪,没有它在那里。

什么是适当的方法来做到这一点? (注意,问题与语言无关,但在ASP.NET 4.0 Web API框架中实现,如果这会影响任何人的答案)。

回答

2

这是一个很好的问题!

有两种方法可以处理该问题。如果正文中的ID与URI中的ID不同,则可以引发验证错误。或者你可以忽略请求体中的任何id。如果您通过手动复制属性进行修补,则不会复制id属性来忽略它。如果您使用助手类来修补实体,则可以应用修补程序,然后将实体的ID设置为URI中的任何内容,以确保它在修补程序后保留相同的ID。

无论你选择哪个选项都取决于你。如果请求主体ID与实体ID不匹配,则发送一个400可能对客户端来说更清楚一些,因此他们明白该ID不会被更改,但它也需要您编写更多的代码来实现。

+0

感谢您的回复。鉴于我已经制定的一切,以及您自己的选项列表,您会以哪种方式进行操作? – tcarvin 2013-02-15 18:57:59

+0

个人而言,我会忽略请求正文中的ID。我并不是说这是最好的解决方案,但我喜欢在理性的范围内保持尽可能简单的逻辑。 – 2013-02-15 19:43:45

+0

感谢您的反馈。我最终在PATCH方法的模型中将id字段设置为可以为null的int(因此是可选的),并且在model.id为null的情况下从URI中交换id。如果指定并且不同于URI中的那个,我会返回一个错误的请求。 – tcarvin 2013-02-20 13:35:30