作为服务器REST API设计的一部分我正在考虑我希望能够返回以客户端授权级别为条件的数据。什么是推荐的方法来完成它仍然称之为一个API?更具体地说,请考虑以下关于图书访问API的示例:
HTTP GET /library/books/{book-name}
任何经过身份验证的客户端都应该能够获取该书的(JSON)数据,例如:
{ “书”: {“book-name”:“abc”,“author”:“someone”} }
但是经过身份验证的客户端的特定子集也应该能够获得:
{ “书”: {“book-name”:“abc”,“author”:“someone”}, “私人信息”: {“book-status”:“on-loan”,“price”:“$ 20”} }
对于给定的图书,任何经过适当授权的客户也可以通过直接的HTTP GET / library / books / {book-name} / private-info访问“私人信息”。
现在,假设有一个合适的客户端身份验证方案,我不禁认为上面的HTTP GET / library / books / {book-name}实际上看起来像两个API,区别于服务器上的授权状态认证。这似乎不是非常RESTful。
也许最好保持基本GET book API对所有人都没有任何“私人信息”,同时提供授权客户端只访问私有信息URI并返回403给所有其他人?
这种类型的条件数据访问通常如何使用REST API处理?
答案 0 :(得分:1)
您的方法没有任何内在错误 - 根据用户的授权隐藏信息是很有意义的。 REST没有说明这一点 - 资源的表示可能取决于用户授权,月相或你能想到的其他任何东西。
如果将私有信息提取到单独的资源,您可以改进缓存。在这种情况下,您将拥有/ library / books / {book-name}的一些相当静态的内容,可以在客户端缓存。那么你将拥有/ library / books / {book-name} / private-info,这将更加易变,并且不依赖于用户 - 因此不易安置。
在此基础上,您可以在原始资源中包含指向私人信息的链接:
{
Title: "A book",
Author: "...",
PrivateInfoLink: "http://your-api.com/library/books/{book-name}/private-info"
}
这样做的好处是双重的:
1)如果客户端无法访问私人信息,服务器可以省略链接,从而使客户端免于不必要的往返(不)获取私人信息。
2)如果稍后需要,服务器可以自由更改私人信息URL(例如,它可以是基于用户授权的不同URL)。
如果您想了解有关超媒体优势的更多信息,请尝试以下方法:http://soabits.blogspot.dk/2013/12/selling-benefits-of-hypermedia.html
答案 1 :(得分:1)