【问题标题】:Is this a correct implementation of REST?这是 REST 的正确实现吗?
【发布时间】:2012-10-30 20:50:18
【问题描述】:

我正在稳步构建我的 API 的资源,但是在对构建 RESTful API 的正确方法进行了大量研究之后,我一直无法找到应该如何接收“复杂”请求的示例。

例如,作为登录过程的一部分(只不过是身份验证密钥更新),客户端会分派以下 URI:

/api/auth/login

URI 上没有值,资源是/auth/,被触发的命令是/login/。实际登录详细信息发送到服务器授权标头。

现在,促使我提出这个问题的原因是,当我正在编写一个命令以允许客户端获得密钥有效期的提醒时,我立即被 getkeyexpiration 或类似命令的东西所吸引名字。

突然觉得这听起来不像我在 6 个约束中读到的,这感觉更像是操作调用。

那么,基于上面的例子,这仍然是一个 RESTful API 吗?我很担心,因为我想不出一种方法来通过简单地使用 URI 资源名称和附加值来执行此操作。

谢谢

编辑:

阅读本文:http://blog.steveklabnik.com/posts/2011-07-03-nobody-understands-rest-or-http

我开始明白,通过用名词词命名资源和仅资源,服务器将如何运行的上下文变得更加清晰。

关于我上面的例子:

/api/auth/login

我使用 auth 作为登录的前缀,因为那是资源的上下文。我正在将我的系统设计为可扩展的,并且需要一种在 URI 级别对资源进行分类的方法。有这样做的标准方法吗?

【问题讨论】:

    标签: api rest parameters uri


    【解决方案1】:

    你的 RESTful 资源应该是名词,因为 HTTP 提供了动词。

    我会建议这样的东西:

    /api/key
    

    然后您可以 POST (包括 HTTP 授权标头)创建一个新密钥,返回如下内容:

    /api/key/1234ABCDBLAHBLAH
    

    这是一个特定于您的会话的密钥,然后您可以 GET 以检索有关它的详细信息,例如到期时间等。当然,您必须在每个后续请求中传递该密钥。

    如果在 RESTful API 的上下文中讨论关键内容时听起来很笨拙,那是因为它通常是。会话是人类/浏览器的概念,但 RESTful API 是应用程序/集成的概念。

    由于服务器不会“登录”到其他服务器,这就引出了一个问题:如果您已经同意要求调用者将 Auth 标头传递给您的登录 API,为什么不只要求将其传递给 每个 API 调用,完全忘记键的概念?

    【讨论】:

    • 最后一点,用户(在这种情况下为系统管理员)需要用户名和密码,无论它是否是一个 restful api。它的工作方式是通过发送用户名并传递一次,服务器使用新生成的密钥更新用户身份验证表并将其发送回客户端,从那时起客户端可以使用身份验证密钥(直到它过期)。这是一种避免在每个请求中发送纯文本用户名和密码的方法。
    • 客户端对密钥的检查不是必需的,当密钥过期时客户端会知道并且必须重新登录,这将由客户端应用程序本身自动完成。 api URI 遵循与 MVC 路由类似的系统,/module/resource/action。一个动作可能是一种子资源。我对使用 URI 发送数据并不完全满意,因为我无法判断请求是否有朝一日可以扩展。命名约定是我在上面的示例中打破的唯一限制吗?
    • 我已经切换到使用类似于您现在描述的系统,所以谢谢
    猜你喜欢
    • 1970-01-01
    • 2012-11-11
    • 2019-09-01
    • 2015-06-02
    • 2021-04-14
    • 1970-01-01
    • 2019-06-19
    • 2011-07-06
    • 1970-01-01
    相关资源
    最近更新 更多