如何在不使用动词的情况下设计RESTful API? 编辑:

如何在不使用动词的情况下设计RESTful API? 编辑:,rest,api-design,Rest,Api Design,这个问题与“浏览器是否可以使用非restful API”或“令牌授权头”无关。这个问题与API设计(查找标签)、良好实践和身份验证(/login)有关,而与授权(令牌头)无关 我知道如何制作API,HTTP协议如何工作,什么是RPC,什么是REST。如果你读了我的问题,你可能会发现我理解这些原则。请仔细阅读我的问题不要只看标题本身,然后回答。您需要上下文才能回答。 我正在尝试设计一个不使用动词的restapi。这变得越来越具有挑战性,因为我正在处理类似控制器的登录/身份验证等案例 比如,在RE

这个问题与“浏览器是否可以使用非restful API”或“令牌授权头”无关。这个问题与API设计(查找标签)、良好实践身份验证
/login
)有关,而与授权(令牌头)无关

我知道如何制作API,HTTP协议如何工作,什么是RPC,什么是REST。如果你读了我的问题,你可能会发现我理解这些原则。请仔细阅读我的问题不要只看标题本身,然后回答。您需要上下文才能回答。


我正在尝试设计一个不使用动词的restapi。这变得越来越具有挑战性,因为我正在处理类似控制器的登录/身份验证等案例

比如,在RESTful服务中,我应该如何像对待身份验证一样对待自然控制器?我可能在这里太迂腐了,如果我是请纠正我,但是如果我的API包含如下请求

GET /authenticate
那么从定义上来说,它并不被认为是完全宁静的。对吗?我的意思是,这显然是一个动词。因此,它是一个RESTful+RPCAPI

如果我在
/authenticate
中违反了我的REST原则,那么为什么我不应该在其他让我的生活更轻松的情况下违反我的REST原则呢?与其他一些业务控制器一样,例如:

GET /users (noun) REST
POST /register (verb) RPC
GET /logout (verb) RPC
这似乎是一个非常语义的问题,如果是这样,我希望你告诉我,我可能认为这是一个愚蠢的方式,所以我可以停止关心这个。但是当我认为API有一个动词时,我觉得很奇怪,所以这就是为什么我要问你的意见。

否则,如果有更好、更RESTful的方式来执行身份验证,我希望得到一些建议。因为在谷歌上找到这个主题的答案很麻烦,除了有人说“不要在RESTful API中使用动词””,这在这种情况下会让人困惑

免责声明:(适用于不谨慎的审阅者/读者) 这可能不是你可能见过的其他问题的重复,比如这个问题

我知道这个特定问题的正确解决方案是什么,因为OP问了一些REST可以很容易完成的问题

我的问题更多的是语义方面的,而不是如何进行基本的REST操作,比如更新用户字段

我发现这两个都不是复制品,但确实非常相似 用户询问哪一个是合适的RESTful设计,但他显然没有得到任何回答。这是“如果您的RESTful设计中有一个/login路径,那么设计是否仍然是RESTful”的语义(愚蠢与否)答案是关于授权,而不是身份验证。

我形成这个免责声明是因为我过去的一些问题被否决了,因为它们被认为是重复的,而实际上它们只是相似的,而且否决票从未被删除,即使我从未得到回复。
不过,如果您找到合适的副本,我真的很乐意接受。只是请不要粗鲁地抛出一个副本,其中唯一重复的是标题。

具有本地登录的REST客户端和服务器示例如下:

服务器API:

  • GET/users/currentUser

    返回描述当前用户的JSON文档(显示名称、电子邮件地址、主题首选项、密码过期日期等)
  • Authorization:basic
    标题中验证用户名和密码,设置上下文。如果无效,抛出401
  • 检索用户信息、序列化、返回
  • GET/todos/

    返回包含所有TODO项的JSON文档
  • Authorization:basic
    标题中验证用户名和密码,设置上下文。如果无效,抛出401
  • 检索待办事项、序列化、返回
客户:

  • 在“未经验证”状态下启动,显示登录界面
  • 单击登录按钮时,使用用户名和密码字段组成
    Authorization:basic
    标题并将其添加到HTTP客户端
  • 使用标题对
    GET/users/currentUser
    进行测试调用,以验证登录信息并检索用户信息。如果401,登录失败-返回登录UI
  • 保存
    Authorization:basic
    标题并转换到“authorized”状态,显示应用程序界面
  • 调用
    GET/todos/
    ,格式化并显示。如果发生401,则转换为“未经验证”状态(例如,其他客户端更改了密码)

  • 您假设的是哪种身份验证?换句话说,为什么您有一个
    /authenticate
    端点?为什么不在每个资源上使用
    授权
    ,并在错误时返回401?如果
    /authenticate
    URL要(例如)接收一个登录令牌以在以后的请求中使用,那么带有
    授权
    头的
    GET/loginToken
    似乎适合“restful”命名。这也符合幂等思维。(如果您认为
    授权
    头与授权有关,这是一种误解。
    授权
    头携带客户端的身份(身份验证)。我将等待回答,但这似乎是链接问题的语义重复。用户是否必须以某种方式登录才能首先获得
    授权
    标题?也就是说,您实际上必须包含一个
    /login
    /authontate
    端点?不,除非您愿意。如果您的服务是通过https的,那么使用HTTP Basic是完全可以接受的。如果不是,那么这通常是将发出令牌的不同(通常是预制)服务的责任。