RESTful API设计:用户名的有效性

RESTful API设计:用户名的有效性,rest,crud,http-status-codes,Rest,Crud,Http Status Codes,我正在设计一个RESTful API,它应该返回注册用户名的有效性。无效案例包括: 重复用户名 太短还是太长 无效字符 我目前的设计是: 获取/valid\u username/{username} 返回204作为有效用户名 对于{err:'DUPLICATE_username'} 这是RESTful API中的首选方式吗 这是RESTful API中的首选方式吗 我不这么认为 设计RESTAPI的指导星只有一个问题:作为一个web站点,您将如何实现它 作为一种集成协议,当客户机提交用户

我正在设计一个RESTful API,它应该返回注册用户名的有效性。无效案例包括:

  • 重复用户名
  • 太短还是太长
  • 无效字符
我目前的设计是:

获取
/valid\u username/{username}

  • 返回204作为有效用户名
  • 对于
    {err:'DUPLICATE_username'}
这是RESTful API中的首选方式吗

这是RESTful API中的首选方式吗

我不这么认为

设计RESTAPI的指导星只有一个问题:作为一个web站点,您将如何实现它

作为一种集成协议,当客户机提交用户名时,您要么希望将其推进到下一个表单,要么将其发送回“上一个”表单,并返回一组错误消息

从技术上讲,您可以使用
204
以愉快的方式实现这一点,并在元数据中添加一个链接,客户机可以从成功页面转到下一个页面。但更可能的是,您会立即发送下一页的表示;因此,
200
将是您最有可能的游戏

对于不满意的路径,您可能不发送下一页的表示,而是发送当前页的表示,其中预填充了数据并突出显示了错误

所以关键一点是:人类关注的是呈现的表示,而不是标题中的元数据。浏览器是元数据的受众。浏览器并不关心消息的语义,它只想知道“我可以缓存这个响应吗?”

对于这种情况,最明显的状态代码选择是:
200
。从语义上讲,集成资源的表示形式从允许您继续的表示形式(用户名Bob可用)更改为迫使您做出另一选择的表示形式(用户名Bob不再可用)。元数据中的各种头描述了应用于此表示的适当缓存策略,等等

从技术上讲,我认为404“有效”,到目前为止,你可以让它做你想做的。语义不正确;从

404(未找到)状态代码表示源服务器未找到目标资源的当前表示形式,或者不愿意透露存在该表示形式

我对这段话的解释是,服务器声称客户端提交了一个错误的请求(所有4xx状态码都有相同的含义),更具体地说,资源标识符的拼写是问题的根源


这是不合适的,因为在本例中,服务器在满足请求时没有任何困难——它完全理解请求;“问题”在于返回的表示不是客户端希望的表示。

REST是关于公开、创建和变异资源的。每个端点URI定义该资源的位置。在用户资源的情况下,您通常会使用类似于
/users
的URI向用户资源集合公开端点,并使用类似于
/users/{id}
的URI向该集合的各个用户资源公开端点。每个端点都绑定到一个资源;不是手术。公开操作的端点遵循RPC体系结构

要以RESTfull方式执行此操作,将在尝试使用用户输入创建用户资源时运行验证。这可以使用HTTP请求行完成,比如
POST/users
。当用户名值的格式无效时,您将使用400状态码进行响应,以指示用户的错误。当与现有用户名冲突时,您可以返回409状态以指示请求和内部API状态之间的冲突。您的回复还应包含一个正文,其中包含问题的进一步细节。成功创建用户资源后,应以201状态响应,以指示资源已成功创建


另一种RESTfull方式是在用户名上键入单个用户资源URI,这样您就有了类似于
/users/{username}
的内容。然后,要检查用户名是否已经存在,只需形成一个请求,如
GET/users/{username}
。如果具有该用户名的用户资源不存在,API应以404状态响应,这将向您的客户端指示该用户名可用。响应状态为200显然表明用户名已在使用。

404似乎不正确,为什么不在发布注册时将用户名无效作为错误?@jornsharpe我们的注册包括两个屏幕。用户在第一个输入用户名,在第二个输入电话号码。我们希望为无效用户名提供即时反馈,即使当时电话号码未知;无论如何,您都必须处理该错误,因为否则,如果其他用户输入电话号码时检查可用性,人们可能会创建具有重复名称的帐户。以下是选择适当HTTP状态代码的示例-对于不同的错误,我会选择409冲突,可能是422冲突