RESTful API:仅用于验证的 METHOD/HEADER 组合

Posted

技术标签:

【中文标题】RESTful API:仅用于验证的 METHOD/HEADER 组合【英文标题】:RESTful API: What METHOD/HEADER combo to use for validation-only 【发布时间】:2012-05-18 00:11:40 【问题描述】:

我希望我的 API 有一个仅验证请求。例如,如果我有一个 URL,例如:

http://api.somesite.com/users/12345

并且用户正在填写关于客户端的信息表格,我最终将 PATCH/PUT/POST 到该资源。当用户填写表格时,我可能希望定期将他们部分完成的更新表示发送到服务器,以便我可以显示他们输入的实时验证(例如,“那个用户名已经被占用”,“那个密码是太短了”)。

似乎没有标准的 HTTP METHOD 或 HEADER 允许在同一资源上执行此行为。看来我的选择是:

    创建新的从属资源进行验证 使用自定义标头(仅限 x-somesite-validation)和 PUT 指示我要验证但不保存

【问题讨论】:

相关问题:***.com/questions/8368931/… 好问题。也遇到了这个问题,我在完全相同的两种方法之间进行辩论。个人倾向于头部。受到 git 在其许多命令中的 --dry-run 参数的启发。 【参考方案1】:

一些选项

1) 使用自定义标题 2) 在查询字符串中放入一些内容,指示仅验证 3) 使用动作 URL,例如\IndividualClient\123\actions\Validate\Invoke 此处为第 19 节 http://restfulobjects.files.wordpress.com/2011/11/restful-objects-spec-052.pdf 4) 分层 URL,例如\IndividualClient\123\验证

从post 我找到了这个建议

当你必须做一些感觉像 RPC 的事情时,请使用 POST 除非您的输入很大,否则将 GET 用于计算之类的事情 哪种情况使用 POST

关于您的具体问题,POST 应该用于#4 和#5。这些操作属于上述“类 RPC”指南。对于 #5,请记住 POST 不一定必须 > 使用 Content-Type: application/x-www-form-urlencoded。这可以很容易地成为 JSON 或 CSV >payload。

这是我正在考虑的:

这是一个资源的添加: 用户/验证 发布 请求:用户资源 响应:验证结果 响应代码 200、400、404、500

这是资源的更新 用户/204/验证 发布 请求:用户资源, 响应:验证结果 响应代码 200、400. 404. 500

【讨论】:

我最终实现了与此非常相似的东西,但为了不重写我的软件路由器,我只是将它作为查询字符串的一部分:POST /user/204?validate【参考方案2】:

第三个选项是在客户端上实现验证功能。然后,此函数将在需要特定信息时发送特定请求。

例如,您实际上不需要发送请求来检查密码是否太短。但是您可以发送一个请求来检查用户名是否存在。

这就是使用 Ajax 进行验证的方式,顺便说一句,它使用的是 Restful API (HTTP):)

【讨论】:

我认为 AJAX 必须使用 HTTP 作为传输协议,但不一定必须将 RESTful 实践作为 API 以有意义的方式实现。说“所有 HTTP 都是 RESTful”没有抓住重点。 另外,无论如何我都将在服务器端进行验证,并且为了不重复自己,我更希望能够使我的验证代码保持标准化并且在一个单一的地方。影响 UI 的实时验证(如密码验证)可以很好地与客户端上的精简、非关键验证一起使用。但它不能代替我上面所问的。 这是开发工作量的两倍(即在客户端和服务器端)。

以上是关于RESTful API:仅用于验证的 METHOD/HEADER 组合的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 5 中验证 RESTful API?

如何使用 Spring Security 做一个 RESTful 登录 API?

Spring RESTful Web 服务身份验证

Restful API AK/SK认证

Restful API AK/SK认证

Restful API AK/SK认证