【问题标题】:OpenRasta URI and method binding clarification - RESTful webserviceOpenRasta URI 和方法绑定说明 - RESTful webservice
【发布时间】:2011-09-20 06:31:50
【问题描述】:

我将 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 方法只接受用户实体作为参数?我是否严重遗漏了什么,或者我对这个设计的理解完全错误?请问有什么想法或意见吗?

【问题讨论】:

    标签: url rest uri openrasta


    【解决方案1】:

    有几个原因。

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

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

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

    【讨论】:

    • 你的解释很有道理,可能是我忽略了其他情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2011-11-25
    • 2013-01-28
    • 2014-08-11
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多