在我们的 API 中,我们希望实现允许客户端提取验证规则的解决方案。同步验证规则和“您的密码应该是 8-100 个符号”等字段下的任何有用文本将很有用。
例如,当客户端请求注册验证规则时,API 使用以下 JSON 进行响应:
{
"email": {
"html5type": "email",
"maxlength": 255,
"required": true
},
"phone": {
"html5type": "tel",
"minlength": 11,
"maxlength": 11,
"pattern": "[0-9]{11}",
"required": true
},
"username": {
"html5type": "text",
"minlength": 5,
"maxlength": 18,
"pattern": "[a-z0-9_]{5,18}",
"required": true
},
"password": {
"html5type": "password",
"minlength": 8,
"maxlength": 100,
"required": true
},
"birthday": {
"html5type": "date",
"required": false
}
}
问题是请求此数据的最佳格式。我们考虑了 3 种方法。
1. 查询参数
客户端应添加?rules
参数到端点并发送请求。
所以这两个请求会有不同的行为:
-
POST /v1/register-account
— 创建帐户。
-
POST /v1/register-account?rules
— 仅响应每个字段的规则列表。
但我不太确定这是实现此功能的优雅方式。在我们的项目中,我们也将为过滤器实现此功能(我的意思是客户端将能够获取过滤器的验证规则)。所以我认为在这样的情况下它看起来会有点难看:
-
GET /v1/products?vendor=33
— 列出 33 家供应商的产品。
-
GET /v1/products?rules
— 获取所有可用过滤器的验证规则。
但我的同事喜欢这种方式。
2. Accept
header
另一个想法是允许客户端设置自定义application/rules+json
MIME 输入Accept
标头将由 API 确定优先级,如果 API 在此标头中满足此 MIME 类型,它将使用验证规则进行响应。
但我们不太喜欢这个主意,因为Accept
header 应该只修改响应的表示(格式)。我的意思是,如果您想要 XML 格式的响应,您可以添加application/xml
到标题;如果你想要 JSON — 你将其设置为等于application/json
。然而,自定义 MIME 类型的想法与表示无关,它绝对是另一种数据!
3.另一个端点
我个人喜欢的一种方式是另一个端点。当客户端发送GET /v1/rules?endpoint=/v1/register-account&method=POST
API 只是简单地响应给定端点的验证规则。
我想知道你的意见。您会选择哪种方式?为什么?也许你还知道这里没有列出的其他好方法。