我正在设计restful服务和其中一个要维护的实体 - 用户帐户。我在.NET中使用成员资格提供程序。
这就是我所拥有的:
/ users / GET - 返回用户列表
/ users / POST - 可以创建或更新 多个用户(发布用户数组 对象)
如果您更新或创建用户
,此POST无关紧要问题我:如何创建服务来更改密码?更改密码与更新用户过程是分开的。我想的是:
/ users / {userName} / password POST - to 更改用户密码。
但是我必须在这里传递不同的对象? (我使用JSON)
您对如何布局网址有什么建议吗?我应该真的创建另一个对象吗? MembershipProvider需要更改旧密码和新密码
答案 0 :(得分:1)
那么问题就在于我们是否将密码视为资源本身,或者不是。
在我的用户dbs中,我将所有密码(盐渍和拉伸)存储在自己的表中,因此我可以轻松地将密码作为单独的资源提供。但仅仅因为你没有那种精细控制并不意味着你不能这样做 - 但我不会考虑为密码实现GET,最终你需要一个身份验证服务,这应该遵循一些协议。
休息服务可以自由地表示其数据,但是没有真正考虑底层结构,因此,我认为如果在您的情况下有意义,您可以自由地将其作为单独的资源来实现。
您可以在用户数据中包含用于更改密码的URI。客户端必须知道要发送的数据类型(所以是的,您将需要专用的资源类型来处理更改请求),并且应该使用POST请求触发uri。
答案 1 :(得分:0)
如果我理解你的问题,你会想知道如何与Uri布局本身相关。以下建议与设计可以用来更改密码的Uri有关。
永远不要在清除URI中包含任何敏感信息,即使它是通过HTTPS提供的,因为该信息可能会写入服务器上的日志文件,或者更糟糕的是,由分析或监控软件记录。确保将敏感信息作为正文的一部分或标题的一部分发送。
以下几点需要考虑为什么使用RESTfull服务更改密码可能需要自己的Uri:
您可以将数据合同提交到https://example.com/users/{id}/password
:
[DataContract]
public class ChangePassword
{
[DataMember]
public string OldPassword { get; set; }
[DataMember]
public string NewPassword { get; set; }
}
后者假设您将授权客户端是否可以实际执行此操作。您可能希望查看PUT vs POST in REST是否使用PUT或POST。此外,在设计RESTfull服务(包括Uri布局)时,本书RESTful Web Services和REST API Design Rulebook对我来说非常宝贵。