【问题标题】:Correct way of defining REST endpoints for user management为用户管理定义 REST 端点的正确方法
【发布时间】:2017-02-02 06:18:32
【问题描述】:

我有一个典型的用户管理模块,我想为其创建 REST API。用户应该能够访问他/她的详细信息,但不应被允许访问其他用户详细信息。作为管理员用户应该能够获取任何用户或删除任何用户。

这就是我计划创建 URL 端点的方式,有什么建议吗?

# To create/register user
POST /api/users/
# or
POST /api/register/

# To get all users
# This will be allowed to access only by admins.
GET /api/users/

# To get current user.
# For admin, allowed
# For regular user, id will be validated against userid stored in the session.
GET /api/users/<id>/

# To update current user.
# This id will be validated against userid stored in the session.
PUT /api/users/<id>/

# To delete current user.
# For admin, allowed
# This id will be validated against userid stored in the session.
DELETE /api/users/<id>/

# Login
POST /api/login/

# Logout
GET /api/logout/

谢谢

【问题讨论】:

  • 尝试理解 HATEOAS 约束。 en.wikipedia.org/wiki/HATEOAS REST 不是关于设计端点,而是关于设计客户端可以遵循的超链接。通过 REST,您可以将客户端与端点结构分离,因此您可以随时更改 URI,而不会破坏客户端......客户端使用链接关系来决定如何处理超链接。 en.wikipedia.org/wiki/Link_relation dpkg 关于无状态约束是正确的,REST API 中不能有登录/注销。
  • 最终这不是一个 REST 或 HATEOS 问题。这是一个关于身份验证和授权的问题。

标签: rest django-rest-framework crud restful-url


【解决方案1】:

我认为您的端点方案非常好.. 唯一的问题是上下文将是传入的用户(来自 url 路径)而不是 当前 用户。

# To create
POST /api/users

# To get all users
GET /api/users

# To get particular user.
GET /api/users/<id>

# To update particular user.
PUT /api/users/<id>

# To delete particular user
DELETE /api/users/<id>

【讨论】:

  • 感谢您的建议:)
  • 只是很挑剔,但我从不喜欢 PUT 是 REST 中的更新的想法。这是一个创建或替换,或者更确切地说是一个“SET”。你可以称之为更新,但它是一个完整的更新。如果你只是设置它的一部分,那么它真的是一个补丁。
【解决方案2】:

一般建议是使您的 REST API 无状态 - 即,如果调用方不是在 api 会话中保留 userId,而是在 api 请求中发送标识(带有 auth 标头)。然后,api 将从标头中检索用户,在执行任何核心操作之前检查该用户是否具有足够的权限(可以使用某种拦截器)。

查看更多详情 - https://stackoverflow.com/a/20311981/1384048

【讨论】:

    猜你喜欢
    • 2021-05-18
    • 2020-11-05
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多