验证模型数据并根据结果调用外部API

本文关键字:结果 调用 外部 API 模型 数据 验证 | 更新日期: 2023-09-27 18:16:07

我创建了一个WebAPI web应用程序,我想在POST和基于结果调用外部API时验证数据。除了验证结果外,数据将原样保存在数据库中。只有调用外部API时才会进行验证。
我已经创建了发布到外部API的逻辑,但我不太确定它将如何成为验证数据的最佳方式。

我的模型包括10个类,如下面的Class1,具有多个属性,我为每个类创建了一个控制器。属性可以有真/假值,但作为字符串。

public class Class1
{
    public ICollection<Class1Data> Data { get; set; }
}
public class Class1Data
{
    public int Id { get; set; }
    public string Prop1{ get; set; }
    public string Prop2 { get; set; }
    ..
    public string Prop10 { get; set; }
}

WebAPI controller for POST:

[ResponseType(typeof(Class1))]
public async Task<IHttpActionResult> PostClass1(Class1 class1)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    db.Class1.Add(class1);
    await db.SaveChangesAsync();
    return CreatedAtRoute("DefaultApi", new { id = Class1.Id }, class1);
}

我已经设法以某种方式验证一个属性和POST到外部API,但不太确定我如何能为我所有的模型类做到这一点(我每个有大约10,20个道具)。

var notValid = Class1.Data.Where(x => x.Prop1 == "False");
if (notValid != null)
{
    foreach ( var fault in notValid )
    {
        // Call external API using fault.Prop1 / fault.Prop5 / ..
    }    
}

我怎样才能做到这一点?我希望我的问题对你有意义。

验证模型数据并根据结果调用外部API

最简单的方法是使用数据注释:

例子:

[StringLength(100)]
public string AccountKey { get; set; }
[Required]
[StringLength(100)]
public string FirstName { get; set; }

或者如果你需要自定义验证,你可以将它们定义为自定义验证属性,并像下面这样使用它们:

[Required]
[CountryCode]
[StringLength(3)]
public string CountryCode { get; set; }

在这个示例中,[CountryCode]是一个自定义验证,您可以这样实现:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter)]
public class CountryCodeAttribute : RegularExpressionAttribute
{
    public CountryCodeAttribute() :
        base("^[A-z]{2,3}([-]{1}[A-z]{2,})?([-]?[A-z]{2})?$")
    {
        ErrorMessage = "Invalid country code.";
    }
}

您需要为这种验证导入这个命名空间:

System.ComponentModel.DataAnnotations