0

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

例如:我已经关注用户实体的设置。

配置:

 ResourceSpace.Has.ResourcesOfType<User>()
          .AtUri("/user")
          .And.AtUri("/user/{userId}")
          .HandledBy<UserHandler>()
          .AsJsonDataContract()
          .And.AsXmlDataContract();

PUT 的处理程序方法:

public OperationResult Put(long userId, User user){}

相同的 URI 将是http://localhost/User/1

请求正文将包含如下 JSON:

{
  "userId":1,
  "userName":"FirstName"
}

在这里,我的问题是:用两个参数定义 PUT 方法是否正确?如果这样做是正确的,那么 PUT 方法中的 userId 参数将包含与用户实体属性 UserId 相同的值。

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

4

1 回答 1

1

有几个原因。

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

第二个是我从来没有尝试过解决这个问题,主要是因为将 uri 参数和响应体结合起来会导致一大堆隐藏的安全问题,你可能想远离它。

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

于 2011-09-20T12:13:25.213 回答