RESTful API:如何判断 GET 检索到的对象是不是可以被当前用户编辑(例如,PUT-able)?
Posted
技术标签:
【中文标题】RESTful API:如何判断 GET 检索到的对象是不是可以被当前用户编辑(例如,PUT-able)?【英文标题】:RESTful API: how to tell whether an object retrieved by GET is editable (e.g, PUT-able) by the current user?RESTful API:如何判断 GET 检索到的对象是否可以被当前用户编辑(例如,PUT-able)? 【发布时间】:2016-06-07 12:27:38 【问题描述】:目前我使用 Django 设置了一个 RESTful API 后端,我可以通过以下 GET 列出一组文章:
api/articles/
另外,我可以通过以下方式获得一篇文章:
api/article/1/
每篇文章归某个用户所有,一个用户当然可以拥有多篇文章。
在前端,我在页面加载时呈现所有文章,我希望当前登录的用户能够以不同的样式看到他们拥有的文章,例如,用框勾勒出来,并且有一个关联的“删除”或“编辑”按钮。
这需要我在检索文章后以编程方式告诉当前用户拥有哪些文章。一种方法是使用所有者 ID 检查当前用户 ID。但是我觉得这不是一个好的选择,因为用户 id 是完全在客户端完成的检查,可能与实际的服务器判断不一致。
因此,有没有办法通过查看 GET 的响应来判断,(比如让服务器返回一个属性“editable=true/false”)来获取当前用户是否可以编辑(PUT)资源?
我知道这可以通过手动附加这样的属性在服务器端完成。但是,我只是在问是否有更好/常见的做法。
我刚开始学习 Web 开发,如果这个问题听起来微不足道,我很抱歉。谢谢!
【问题讨论】:
【参考方案1】:您可以按照您的建议手动附加适当性。这种方法的优点是你不需要任何其他的http请求。
第二种可能是,您的客户端有意请求有关端点权限的信息。在这种情况下,我建议使用 OPTIONS HTTP 方法。您将 OPTIONS HTTP 请求发送到 api/articles/1 并且后端返回想要的信息。这可能正是 OPTIONS 方法和 DRF 元数据的用途。
http://www.django-rest-framework.org/api-guide/metadata/
【讨论】:
选项看起来像我要找的。非常感谢! 不客气。对于将面临类似问题的任何其他用户,您可以通过接受我的回答来感谢我。【参考方案2】:我认为这是一个非常有趣的问题。
我想到的几个选项:
您可以在GET api/article/1
响应中添加包含此信息的 HTTP 标头,即HTTP_METHODS_ALLOWED=PUT,PATH,DELETE
。这样做有助于 API 客户端,因为它不需要知道任何其他内容。我认为当返回多个实体时,这不是一个好方法。
致电OPTIONS api/article/1
。可以返回该用户在该资源上允许的方法,但请注意,在我看来,这种方法在性能方面不是很好,因为它复制了对服务器的请求数。
但是,如果返回的实体还包含有关所有者或它的信息怎么办?在这种情况下,客户可以知道适用哪个策略并尝试自己找出它吗?请注意,可以从另一个端点(只需要一次调用)甚至通过登录响应获取该策略。如果您的实体不包含此类信息,它也可以作为 HTTP 标头返回(如上面的第一个选项)
【讨论】:
以上是关于RESTful API:如何判断 GET 检索到的对象是不是可以被当前用户编辑(例如,PUT-able)?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Java 中的 RESTFul 服务向 Ipstack API 请求 GET