如何以RESTful方式公开validationAPI?
我通常是RESTful APIdevise的粉丝,但我不确定如何将REST原则应用于validationAPI。
假设我们有一个API来查询和更新用户的个人资料信息(姓名,电子邮件,用户名,密码)。 我们认为一个有用的function部分将是validation,例如查询给定的用户名是否有效和可用。
这种情况下的资源是什么? 什么HTTP状态代码和/或标题应该使用?
作为开始,我有GET /profile/validate
,其中包含查询string参数,并返回204
或400
如果有效或无效。 但是validate
显然是一个动词,而不是一个名词。
你所描述的东西的types在其语义上肯定更多的是RPC风格,但这并不意味着你不能以REST风格实现你的目标。
没有有效的HTTP动词,那么你可以通过构build一个完整的API来获得多less价值? 你的故事围绕着为用户提供确定一个给定的用户名是否可用的能力 – 这听起来就像一个简单的资源检索检查 – GET: /profile/username/...
– 如果结果是404,名字可用。
这里强调的是客户端validation就是客户端。 确保数据在发送到服务器之前在客户端进行validation是一个UI问题。 REST风格的服务不pipe客户是否已经执行validation; 它将简单地接受或拒绝基于其自己的validation逻辑的请求。
REST并不是一个包罗万象的范例,它只是描述了构build客户端 – 服务器通信的一种方式。
我们也遇到了同样的问题。 我们推断客户服从服务器进行validation的原因是为了防止有不匹配的规则。 在对资源进行操作之前,服务器需要validation所有内容。 两次编写这些规则是没有意义的,并且有可能导致它们不同步。 因此,我们提出了一个似乎与REST思想保持一致的策略,同时允许我们请求服务器执行validation。
我们的第一步是实现可以从元数据服务( GET /metadata/user
)请求的元数据对象。 这个元数据对象然后用来告诉客户端如何做基本的客户端validation(必需,types,长度等)。 我们从我们的数据库中生成大部分这些。
第二部分包括添加一个称为分析的新资源。 举例来说,如果我们有服务:
GET /users/100
我们将创build一个名为:
POST /users/100/analysis
分析资源不仅包含发生的任何validation错误,还包含可能在必要时相关的统计信息。 我们辩论的一个问题是哪个动词用于分析资源。 我们已经得出结论,应该是一个POST,因为在请求时正在创build分析。 然而,GET也有强烈的争议。
我希望这有助于其他人试图解决这个问题。 任何对这个devise的反馈表示赞赏。
您将REST与资源导向混淆,REST中没有什么说您不能在URL中使用动词。 当谈到网页devise时,我通常会select最具自我描述性的东西,它们是名词或动词。
关于你的服务,我要做的是使用你用来更新的资源,但是使用test
查询string参数,所以当test=1
,操作没有完成,但是你可以用它来返回validation错误。
PATCH /profile?test=1 Content-Type: application/x-www-form-urlencoded dob=foo
…和回应:
HTTP/1.1 400 Bad Request Content-Type: text/html <ul class="errors"> <li data-name="dob">foo is not a valid date.</li> </ul>
很有必要在REST API中进行validation。 无论如何你都需要validation,不要在客户端使用它。 在我的情况下,我只是在API中有一个约定,一个特殊的error_id代表validation错误,而在error_details中有一个错误信息数组,每个feild在这个PUT或POST调用中都有错误。 对于考试者:
{ "error": true, "error_id": 20301, "error_message": "Validation failed!", "error_details": { "number": [ "Number must not be empty" ], "ean": [ "Ean must not be empty", "Ean is not a valid EAN" ] } }
如果您对Web和移动应用程序使用相同的REST API,则只需更新API即可更改validation。 特别是移动更新将花费超过24小时才能在商店上发布。
移动应用程序的外观如下图所示:
PUT或POST的响应用于显示每个字段的错误消息。 这是来自使用React的Web应用程序的相同调用:
通过这种方式,所有REST API响应代码(如200,404)都具有他们应该具有的意义。 即使validation失败,PUT调用200响应。 如果调用通过validation,则响应如下所示:
{ "error": false, "item": { "id": 1, "created_at": "2016-08-03 13:58:11", "updated_at": "2016-11-30 08:55:58", "deleted_at": null, "name": "Artikel 1", "number": "1273673813", "ean": "12345678912222" } }