在我们的API中,我们希望实现允许客户端提取验证规则的解决方案。在#34之类的字段下同步验证规则和任何有用的文本将非常有用;您的密码应为8-100个符号"。
例如,当客户端请求验证规则进行注册时,使用此JSON的API响应:
{
"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种方法。
客户端应将?rules
参数添加到端点并发送请求。
所以这两个请求会有不同的行为:
POST /v1/register-account
- 创建帐户。POST /v1/register-account?rules
- 只针对每个字段的规则列表进行回复。但我不确定这是实现此功能的优雅方式。在我们的项目中,我们也将为过滤器实现此功能(我的意思是客户端将能够获得过滤器的验证规则)。所以我认为在这样的情况下看起来会有点难看:
GET /v1/products?vendor=33
- 列出33家供应商的产品。GET /v1/products?rules
- 获取所有可用过滤器的验证规则。但我的同事喜欢这样。
Accept
标题另一个想法是允许客户端在application/rules+json
标头中设置自定义Accept
MIME类型,这将由API确定优先级,如果API在此标头中满足此MIME类型,则它将使用验证规则进行响应。
但我们并不喜欢这个想法,因为Accept
标题只应修改响应的表示(格式)。我的意思是如果你想要XML格式的响应,你可以在标题中添加application/xml
;如果你想要JSON - 你设置它等于application/json
。但是,使用自定义MIME类型的这个想法与表示无关,它绝对是另一种数据!
我个人喜欢的方式是另一个端点。当客户端发送GET /v1/rules?endpoint=/v1/register-account&method=POST
API时,只需响应给定端点的验证规则。
我想知道你的意见。你会选择哪种方式?为什么?也许你知道这里没有列出的其他好方法。
答案 0 :(得分:2)
JSON Schema是用于验证JSON数据的广泛接受的词汇表。如果你使用它而不是你自己的最好。
由于JSON Schema很受欢迎,因此许多验证器存在于不同的编程语言中。使用JSON模式验证器,客户端可以根据您的JSON模式轻松验证其数据。
对于端点,您只需使用OPTIONS
HTTP方法即可。因此OPTIONS /v1/register-account
应该返回使用该端点的要求(包括模式)。请参阅this article作为示例。