Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以RESTful方式公开验证API?_Rest_Http_Restapi - Fatal编程技术网

如何以RESTful方式公开验证API?

如何以RESTful方式公开验证API?,rest,http,restapi,Rest,Http,Restapi,我通常是RESTful API设计的爱好者,但我不确定如何将REST原则应用于验证API 假设我们有一个用于查询和更新用户配置文件信息(姓名、电子邮件、用户名、密码)的API。我们认为公开一个有用的功能是验证,例如查询给定用户名是否有效和可用 这种情况下的资源是什么?应该使用什么HTTP状态代码和/或标头 首先,我有GET/profile/validate,它接受查询字符串参数,并返回204或400(如果有效或无效)。但是,validate显然是一个动词而不是名词。您所描述的类型在其“语义”上肯

我通常是RESTful API设计的爱好者,但我不确定如何将REST原则应用于验证API

假设我们有一个用于查询和更新用户配置文件信息(姓名、电子邮件、用户名、密码)的API。我们认为公开一个有用的功能是验证,例如查询给定用户名是否有效和可用

这种情况下的资源是什么?应该使用什么HTTP状态代码和/或标头


首先,我有
GET/profile/validate
,它接受查询字符串参数,并返回
204
400
(如果有效或无效)。但是,
validate
显然是一个动词而不是名词。

您所描述的类型在其“语义”上肯定更像RPC风格,但这并不意味着您不能以RESTful方式实现目标

没有
VALIDATE
HTTP动词,那么围绕它构建一个完整的API有多大价值呢?您的故事围绕着为用户提供确定给定用户名是否可用的能力-这听起来像是一个简单的资源检索检查-
GET:/profile/username/…
-如果结果是404,则该名称可用

这突出显示的是,客户端验证只是客户端验证。确保数据在发送到服务器之前在客户端上经过验证是一个UI问题。RESTful服务不提供客户机是否执行了验证的信息;它将根据自己的验证逻辑简单地接受或拒绝请求


REST不是一个包罗万象的范例,它只描述了一种构建客户机-服务器通信的方式

您将REST与资源定向混淆了,REST中没有任何内容表明您不能在URL中使用动词。当涉及到URL设计时,我通常选择最能自我描述的,无论是名词还是动词

关于您的服务,我要做的是使用您用于更新的相同资源,但带有
test
querystring参数,因此当
test=1
操作未完成时,您可以使用它返回验证错误

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>
HTTP/1.1400错误请求
内容类型:text/html
    foo不是有效日期

我们也遇到了同样的问题。我们让客户机服从服务器进行验证的理由是为了防止规则不匹配。服务器需要在对资源执行操作之前验证所有内容。对这些规则进行两次编码并使它们失去同步是没有意义的。因此,我们提出了一种似乎与REST理念保持一致的策略,同时允许我们要求服务器执行验证

我们的第一步是实现可以从元数据服务(
GET/metadata/user
)请求的元数据对象。然后使用此元数据对象告诉客户机如何进行基本的客户端验证(所需性、类型、长度等)。我们从数据库中生成了其中的大部分

第二部分包括添加一个称为分析的新资源。例如,如果我们有一项服务:

GET /users/100
我们将创建一个名为:

POST /users/100/analysis
分析资源不仅包含发生的任何验证错误,还包含可能相关的统计信息(如果需要)。我们讨论过的问题之一是使用哪个动词作为分析资源。我们的结论是,这应该是一个职位,因为分析是在提出请求时创建的。然而,GET也有很强的理由


我希望这对其他试图解决同样问题的人有所帮助。欢迎对此设计的任何反馈。

在REST API中进行验证非常好。无论如何,您都需要验证,wy不能在客户端使用它。在我的例子中,我只是在API中有一个约定,即一个特殊的error\u id表示验证错误,在error\u详细信息中,对于在这个PUT或POST调用中有错误的每个字段,都有一个错误消息数组。例如:

{
“错误”:正确,
“错误id”:20301,
“错误消息”:“验证失败!”,
“错误详细信息”:{
“编号”:[
“编号不能为空”
],
“ean”:[
“Ean不能为空”,
“Ean不是有效的Ean”
]
}
}
如果您对web和移动应用程序使用相同的RESTAPI,那么您将希望能够仅通过更新API来更改这两种应用程序中的验证。尤其是手机更新需要24小时以上才能在商店发布

这就是它在移动应用程序中的外观:

PUT或POST的响应用于显示每个字段的错误消息。这与使用React的web应用程序的调用相同:

这样,所有RESTAPI响应代码(如200、404)都有其应有的含义。即使验证失败,PUT调用也会响应200。如果调用通过验证,则响应如下所示:

{
“错误”:错误,
“项目”:{
“id”:1,
“创建时间”:“2016-08-03 13:58:11”,
“更新时间”:“2016-11-30 08:55:58”,
“已删除位置”:空,
“名称”:“Artikel 1”,
“编号”:“1273673813”,
“ean”:“1234567891222”
}

}
一种非常常见的情况是,用户或个人资料注册表单的用户名和电子邮件应该是唯一的。文本框的模糊部分通常会显示一条错误消息,让用户知道用户名已经存在,或者他们输入的电子邮件已经与另一个帐户关联。其他答案中提到了很多选项,但我不喜欢需要查找404的想法,这意味着用户名不存在,因此它是有效的,等待提交以验证整个对象,返回元数据进行验证对检查没有帮助
/users/validation/username/{username}
/users/validation/email/{email}
/users/{userId:guid}/validation/username/{username}
/users/{userId:guid}/validation/email/{email}