Url OpenRastaURI和方法绑定澄清-RESTful Web服务

Url OpenRastaURI和方法绑定澄清-RESTful Web服务,url,rest,uri,openrasta,Url,Rest,Uri,Openrasta,我将Openrasta用于我的RESTful Web服务,我对方法参数和URI有点怀疑 例如:我对用户实体进行了以下设置 配置: ResourceSpace.Has.ResourcesOfType<User>() .AtUri("/user") .And.AtUri("/user/{userId}") .HandledBy<UserHandler>() .AsJsonDataContract

我将Openrasta用于我的RESTful Web服务,我对方法参数和URI有点怀疑

例如:我对用户实体进行了以下设置

配置:

 ResourceSpace.Has.ResourcesOfType<User>()
          .AtUri("/user")
          .And.AtUri("/user/{userId}")
          .HandledBy<UserHandler>()
          .AsJsonDataContract()
          .And.AsXmlDataContract();
相同的URI将被删除

请求正文将包含一个JSON,如下所示:

{
  "userId":1,
  "userName":"FirstName"
}
这里,我的问题是:用两个参数定义PUT方法是否正确?若这样做是正确的,那个么PUT方法中的userId参数将包含和用户实体属性userId相同的值


在PUT方法中,我需要验证这两个值是否相同,如果它们不相同,我将返回BadRequest,说明URI与请求中提供的实体不匹配。为什么我们要明确地这样做?为什么不能在处理请求时处理它,并让PUT方法仅使用用户实体作为参数?我是否完全遗漏了什么,或者我对这个设计的理解完全错误?有什么想法或意见吗?

有几个原因

首先,这是一个技术限制,限制了URI参数如何处理并与输入一次匹配一个变量。这同样适用于键/值编解码器,因此应该允许您拥有一个用户对象。但当您使用json编解码器时,我们会返回一个完整的对象,因此最终会一起覆盖用户

第二个问题是,我从来没有试图解决这个问题,主要是因为将uri参数和响应体结合起来会导致一系列隐藏的安全问题,您可能希望远离这些问题


最后也是同样重要的一点,从建模的角度来看,ReST API应该使用URI作为标识符和链接,而不是外键,因此,如果您已经有了标识符(URI),那么就没有理由在实体体中对其进行建模。

您的解释很有意义,我可能忽略了其他情况。
{
  "userId":1,
  "userName":"FirstName"
}