【问题标题】:How should I design a RESTful URL to validate an object我应该如何设计一个 RESTful URL 来验证一个对象
【发布时间】:2011-12-03 16:07:06
【问题描述】:

在不脱离 RESTful 范式的情况下,您如何以 RESTful 方式对对象验证进行建模?最好解释一下我提出的理论用例......

想象一下,您有一个带有非常薄的 Web 层的系统,用于调用后端 RESTful 服务。假设用户访问并提交了注册表单,Web 层会将未经验证的数据直接发送到后端服务,如果服务以 JSON 格式响应验证错误,则可以将这些数据作为 HTML 发送回用户。

但是,假设我们希望在表单上具有 AJAX 行为。例如,用户输入他们的电子邮件地址,我们想使用 AJAX 进行验证,如果他们的电子邮件地址已经注册,则向用户发送错误。

实现一个调用来仅验证电子邮件地址是否有意义,或者是否可以在后端服务中发送和验证整个对象?如果是后者,您可以使用哪个 URL 仅验证一个对象,而不是实际创建它?

【问题讨论】:

    标签: rest


    【解决方案1】:

    过去我使用沙盒子资源的概念来执行您的建议,

    http://example.com/customer/23/sandbox
    

    这允许我发布增量并应用和验证更改,但实际上并未提交。这对于传统的“保存/取消”类型的对话框非常有效。

    但是,我发现处理这些增量确实很痛苦,因此我开发了一种不同的媒体类型,它在客户端上记录一系列事件,然后将该文档发布到沙箱资源。通过重放事件序列,我可以以更简单的方式更新和验证服务器端资源。

    后来我意识到我真的不需要独特的“沙盒”资源,现在我只需将“事件序列”文档直接发布到它所影响的资源。我在文档本身中有一些数据可以确定更改是永久的还是暂时的。这仅取决于用户是否按下了保存按钮。

    【讨论】:

    • 您有“事件序列”文档的示例吗?是否还可以直接POST 到资源?
    • @mjs 是的,您可以直接发布到资源。这实际上就是我现在所做的。我删除了沙盒子资源。我有一个简短的视频在这里vimeo.com/15564107 讨论这个概念,我计划在接下来的几个月内发布媒体类型的规范和解析器。
    【解决方案2】:

    验证单个表单字段可以在用户填写表单时改善用户体验,但是当提交表单时,我会验证整个对象,因为它不太容易出错。 URL 可以是简单的https://mysite.com/users/emailvalidator 用于仅验证电子邮件(单个字段),并且可以将表单发布到https://mysite.com/users(整个对象)。在前一种情况下,URL 清楚地表明您要使用的资源是能够验证电子邮件的对象。

    【讨论】:

    • 我在考虑更多关于后端服务的 REST 调用。想象一下,实际注册用户的调用是对 /users 的 POST,我怎么能在本质上进行相同的调用,但只是为了验证?
    • 阅读:restfulobjects.files.wordpress.com/2011/11/…。它谈到了发送一个查询参数“x-ro-validate-only=true”来指示服务器只验证而不是实际变异。
    • 我会使用上面的分层 URL,因为“emailvalidator”资源是“用户”资源的一部分。从逻辑的角度来看,“用户”是一个存储用户数据的容器,它还可以在插入新数据之前对其进行验证。同样从逻辑的角度来看,对象“emailvalidator”是这个验证过程的一部分,一个可以直接调用的特殊部分,使用它自己的 URL。 (有关分层 URL 设计的问题请参见:stackoverflow.com/questions/7833548/…
    • 其实你可以 POST 任何符合后端服务可以接受的内容(可以使用 WSDL 或 WADL 定义)。使用单个 URL“/users”也是正确的,并通过检查查询中的参数来决定如何处理客户端的请求。 (我只是更喜欢对逻辑上不同的资源使用分层 URL 和不同的 URL。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多