检查用户名是否有效的 API 端点的最佳名称

Best name for an API endpoint that checks if a username is valid or not

我要设计一个 RESTful API 来检查是否有任何错误(例如重复,无效字符,或黑名单中列出的名称......)与提供的用户名来电者。

API 应该return 将检查结果(有效或无效)告诉调用者,以便调用者知道他是否可以使用此用户名。

如何命名 API 端点?

我原本以为 GET /checkUserName/{username}GET /isUserNameValid/{username} 是我 API 的好名字。但我不确定它们是否真的很好。而且我不知道如何方便别人接受我想出的名字。

GET是http方法。 username是调用者提供的参数。

我阅读了以下两篇文章:

10 best practices for better restful api

RESTful API Designing guidelines — The best practices

但我的名字 API 似乎无法符合上述文章中描述的所有准则。

其中一条准则说

Use nouns but no verbs

遵循此准则,GET /checkUserName/{username} 是不合适的。因为它包含动词check

GET /isUserNameValid/{username}也不合适。因为is是动词。

如果我必须遵循 RESTful 设计指南,API 的最佳名称是什么?

我想不出一个不包含动词的合适名称。

听起来您正在尝试构建 RPC API 但想将其称为 REST。 :)

有点background information on the differences.

通常我会尝试建议重构,因为通常验证最好在服务器端处理,JSON 架构被定义并与前端共享,这样他们也可以使用 JSON 本地模式验证器并匹配验证。

“重复”标准是 JSON Schema 无法验证的一件事,我确信用例是那些用户名框之一,它可以即时反馈用户名的好坏在提交实际表格之前。

那么一些方法。

1.) 微服务​​

流行语是的,但通常当需要做一件特定事情的微小端点时,特别是如果那件事有点 RPC 而 API 的其余部分是 REST API,我用的是一个小服务

经常 API 为了 RAD 而写成 PHP 或 Ruby 并且有一些巨大的框架,但对于一些需要经常快速工作的小系统我'我用过像 Go 这样更小的东西。

您当然可以使用相同的语言,通常的 Sinatra 与 Rails 差异开始发挥作用。这可能只是一个 RPC

2.) REST Crowbar

因此,要使其成为 RESTful,您只需创建一个新的资源类型,它需要类似于:

POST /username-checks

{ "username": "foo" }

我不太喜欢这个,但这可能是因为有一个我们甚至还没有考虑过的更好的设计。

3.) 大哥

一旦注册表中输入了电子邮件之类的内容,请保存到目前为止已填写的所有内容。

这个 可以 是一个 POST /users 具有填充字段并且默认具有“潜在”状态,或者它可以是其他一些 POST /user-potential资源。这取决于您,但是很少、很早发布的想法有两个好处。

  1. 您可以向人们发出废弃购物车风格的提醒以“完成他们的帐户”,这在电子商务世界中变得越来越普遍
  2. 一旦你创建了这个资源,你就有了一个你可以PATCH反对的UUID。

尝试使用无效的用户名进行 PATCH 会给您带来验证错误。

PATCH /users/<uuid>

{ username: "admin" }

对于您的错误,请考虑使用 RFC 7807: API Problems,这太棒了。

我并不是要在这里设置错误的三分法,可能还有其他一些方法,但我真的会考虑 1 或 3,其中 2 可能是我为了方便而加入的给出完整的答案。

其实我更喜欢这个

POST /usernames/:username/check

因为它将 username 变成了一种资源,为将来处理用户名的任何 API 端点铺平了道路,例如

POST /usernames/:username/exists

我打算做的是,通过在该字段所属的对象下创建该字段的子资源,将我想根据某些规则与它们所属的对象分开进行验证的字段然后尝试为其创建 (POST) 一个值。如果它 returns 409,那么已经存在一个。如果它 returns 200 OK 或 201 Created 那么它是有效的。 400 表示验证失败。

或者,我正在考虑针对该字段的特定实例(用户输入的数据)执行 GET,如果它 returns 404,那么它是唯一的并且不存在。如果您需要进行某种其他业务规则验证而不是唯一性,我认为这不会起作用。