如何为API客户端提供端点的最新验证规则?

时间:2017-10-18 17:55:12

标签: json forms api validation

在我们的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种方法。

1。查询参数

客户端应将?rules参数添加到端点并发送请求。

所以这两个请求会有不同的行为:

  • POST /v1/register-account - 创建帐户。
  • POST /v1/register-account?rules - 只针对每个字段的规则列表进行回复。

但我不确定这是实现此功能的优雅方式。在我们的项目中,我们也将为过滤器实现此功能(我的意思是客户端将能够获得过滤器的验证规则)。所以我认为在这样的情况下看起来会有点难看:

  • GET /v1/products?vendor=33 - 列出33家供应商的产品。
  • GET /v1/products?rules - 获取所有可用过滤器的验证规则。

但我的同事喜欢这样。

2。 Accept标题

另一个想法是允许客户端在application/rules+json标头中设置自定义Accept MIME类型,这将由API确定优先级,如果API在此标头中满足此MIME类型,则它将使用验证规则进行响应。

但我们并不喜欢这个想法,因为Accept标题只应修改响应的表示(格式)。我的意思是如果你想要XML格式的响应,你可以在标题中添加application/xml;如果你想要JSON - 你设置它等于application/json。但是,使用自定义MIME类型的这个想法与表示无关,它绝对是另一种数据!

3。另一个端点

我个人喜欢的方式是另一个端点。当客户端发送GET /v1/rules?endpoint=/v1/register-account&method=POST API时,只需响应给定端点的验证规则。

我想知道你的意见。你会选择哪种方式?为什么?也许你知道这里没有列出的其他好方法。

1 个答案:

答案 0 :(得分:2)

JSON Schema是用于验证JSON数据的广泛接受的词汇表。如果你使用它而不是你自己的最好。

由于JSON Schema很受欢迎,因此许多验证器存在于不同的编程语言中。使用JSON模式验证器,客户端可以根据您的JSON模式轻松验证其数据。

对于端点,您只需使用OPTIONS HTTP方法即可。因此OPTIONS /v1/register-account应该返回使用该端点的要求(包括模式)。请参阅this article作为示例。