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?
目前我使用 Django 设置了一个 RESTful API 后端,我可以通过以下 GET 列出一组文章:
api/articles/
此外,我可以通过以下方式获取单篇文章:
api/article/1/
每篇文章都归某个用户所有,一个用户当然可以拥有多篇文章。
在前端,我在页面加载时展示了所有的文章,我希望当前登录的用户能够以不同的风格看到他们拥有的文章,例如用框勾勒出来,并有一个关联的 "delete" 或 "edit" 按钮。
这需要我在检索文章后以编程方式告诉当前用户拥有哪些文章。这样做的一种方法是使用所有者 ID 检查当前用户 ID。但是我觉得这不是一个好的选择,因为用户id是完全在客户端检查的,可能与实际服务器判断不一致。
因此,有没有办法,通过查看GET的响应来判断,(比如,让服务器return一个属性"editable=true/false")来获取是否当前用户可以编辑(PUT)资源?
我知道这可以在服务器端通过手动附加这样的 属性 来完成。不过,我只是问有没有better/common实践
我刚开始学习网络开发,如果这个问题听起来微不足道,我很抱歉。谢谢!
我认为这是一个非常有趣的问题。
我想到的几个选项:
- 您可以将包含此信息的 HTTP header 添加到
GET api/article/1
响应,即 HTTP_METHODS_ALLOWED=PUT,PATH,DELETE
。这样做有助于 API 客户端,因为它不需要知道任何其他信息。我认为当返回多个实体时,这不是一种好方法。
- 致电
OPTIONS api/article/1
。可以返回该用户对该资源允许的方法,但请注意,在我看来,这种方法在性能方面不是很好,因为它重复了对服务器的请求数。
- 但是,如果返回的实体还包含有关所有者或它的信息怎么办?在这种情况下,客户可以知道适用哪个策略并尝试自己弄清楚吗?请注意,该策略可以从另一个端点(只需要一次调用)或什至通过登录响应获得。如果您的实体不包含此类信息,它也可以作为 HTTP header(如上面的第一个选项)
返回
您可以按照您的建议手动附加属性。这种方法的优点是您不需要任何其他 http 请求。
第二种可能是,您的客户端有意请求有关端点权限的信息。在这种情况下,我建议使用 OPTIONS HTTP 方法。您将 OPTIONS HTTP 请求发送到 api/articles/1 和后端 returns 想要的信息。这可能正是 OPTIONS 方法和 DRF 元数据的用途。
目前我使用 Django 设置了一个 RESTful API 后端,我可以通过以下 GET 列出一组文章:
api/articles/
此外,我可以通过以下方式获取单篇文章:
api/article/1/
每篇文章都归某个用户所有,一个用户当然可以拥有多篇文章。
在前端,我在页面加载时展示了所有的文章,我希望当前登录的用户能够以不同的风格看到他们拥有的文章,例如用框勾勒出来,并有一个关联的 "delete" 或 "edit" 按钮。
这需要我在检索文章后以编程方式告诉当前用户拥有哪些文章。这样做的一种方法是使用所有者 ID 检查当前用户 ID。但是我觉得这不是一个好的选择,因为用户id是完全在客户端检查的,可能与实际服务器判断不一致。
因此,有没有办法,通过查看GET的响应来判断,(比如,让服务器return一个属性"editable=true/false")来获取是否当前用户可以编辑(PUT)资源?
我知道这可以在服务器端通过手动附加这样的 属性 来完成。不过,我只是问有没有better/common实践
我刚开始学习网络开发,如果这个问题听起来微不足道,我很抱歉。谢谢!
我认为这是一个非常有趣的问题。
我想到的几个选项:
- 您可以将包含此信息的 HTTP header 添加到
GET api/article/1
响应,即HTTP_METHODS_ALLOWED=PUT,PATH,DELETE
。这样做有助于 API 客户端,因为它不需要知道任何其他信息。我认为当返回多个实体时,这不是一种好方法。 - 致电
OPTIONS api/article/1
。可以返回该用户对该资源允许的方法,但请注意,在我看来,这种方法在性能方面不是很好,因为它重复了对服务器的请求数。 - 但是,如果返回的实体还包含有关所有者或它的信息怎么办?在这种情况下,客户可以知道适用哪个策略并尝试自己弄清楚吗?请注意,该策略可以从另一个端点(只需要一次调用)或什至通过登录响应获得。如果您的实体不包含此类信息,它也可以作为 HTTP header(如上面的第一个选项) 返回
您可以按照您的建议手动附加属性。这种方法的优点是您不需要任何其他 http 请求。
第二种可能是,您的客户端有意请求有关端点权限的信息。在这种情况下,我建议使用 OPTIONS HTTP 方法。您将 OPTIONS HTTP 请求发送到 api/articles/1 和后端 returns 想要的信息。这可能正是 OPTIONS 方法和 DRF 元数据的用途。