繁体   English   中英

如何验证此方案的Web api请求对象?

[英]how can I validate a web api request object for this scenario?

我在Web API 2.2项目中有一个api / v1 / users / search uri。 此uri接受UserSearchRequest对象。 这是一个示例:

{
"DomainName":"ad.corp.domain",
"NetworkUserId":"jsmith2",
"FirstName":"John",
"LastName":"Smith"
}

后端搜索逻辑将附加所有提供的请求参数值,以过滤返回的用户集。 否则,空请求对象将导致返回所有用户。 但是,如果客户端传递了如下所示的请求,则将返回所有用户:

{
"UserName":"jsmith2"
}

在上面的示例中,错误地使用了UserName的无效proprty而不是NetworkUserId。 但是,它不是Web API返回错误,而是简单地忽略了附加属性并返回了所有用户,因为没有提供有效的搜索条件属性值。

什么是验证传入请求的正确方法,以便如果提供了无效的prpoerty名称,那么Web API将返回404 BadRequest,并且最好指示无效的属性名称?

你正面临着“过度发布”的问题 这可以通过几种不同的方式处理:

  1. 使用“ Bind属性并将所需属性列入白名单或黑名单。

      public ActionResult search([Bind(Exclude="UserName")] Person person) { ... } public ActionResult search([Bind(Include="DomainName, NetworkUserId, FirstName, LastName")] Person person) { ... } 
  2. 另一种解决方案是通过扩展IModelBinder来创建Custom Model Binder 这将识别额外的列并将其作为错误处理。 您可以在此处查看实施情况。

如果属性名称或数据类型不正确,web api将无法将json反序列化为UserSearchRequest对象,并且api控制器参数将为null。 您可以检查null,这将指示输入请求未正确格式化。 这是示例代码:

 public async Task<IActionResult> SearchUsers([FromBody] UserSearchRequest 
 searchRequest) {
   if(searchRequest == null)
    {
        return BadRequest();
    }
   //For valid search request, continue search...
}

我想你在这里从特定的x或y表中获取数据。 你在这里展示的是返回目录数据。 这实际上很容易。 控制器代码,您可以管理验证。 我认为你想要获得“NetworkUserId”,但控制器你可能会改为用户名。 请检查您的数据类型。 请附上您的控制器代码和型号等级。谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM