溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

AspNetCore WebApi如何實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證

發(fā)布時(shí)間:2020-10-28 19:53:08 來(lái)源:億速云 閱讀:474 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

AspNetCore WebApi如何實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

傳統(tǒng)驗(yàn)證

[HttpPost]
public async Task<ActionResult<Todo>> PostTodo(Todo todo)
{
  if (string.IsNullOrEmpty(todo.Name))
  {
    return Ok("名稱不能為空");
  }
  context.Todo.Add(todo);
  await context.SaveChangesAsync();

  return CreatedAtAction("GetTodo", new { id = todo.Id }, todo);
}

小明寫(xiě)著寫(xiě)著發(fā)現(xiàn)這樣寫(xiě),很多接口相同得地方都要寫(xiě),使得代碼比較臃腫。

使用模型驗(yàn)證

在參數(shù)模型上打上注解

namespace App001.Models
{
  /// <summary>
  /// 待辦事項(xiàng)
  /// </summary>
  public class Todo
  {
    /// <summary>
    /// ID
    /// </summary>
    public Guid Id { get; set; }
    /// <summary>
    /// 名稱
    /// </summary>
    [Required(ErrorMessage = "名稱不能為空")]
    public string Name { get; set; }
  }
}

Postman測(cè)試Name傳值未空時(shí),則返回:

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "traceId": "|df184e36-4e11844dfd38a626.",
  "errors": {
    "Name": [
      "名稱不能為空"
    ]
  }
}

注意Web API 控制器具有 [ApiController] 特性,則它們不必檢查ModelState.IsValid。在此情況下,如果模型狀態(tài)無(wú)效,將返回包含錯(cuò)誤詳細(xì)信息的自動(dòng) HTTP 400 響應(yīng)。

內(nèi)置特性

  • [CreditCard]:驗(yàn)證屬性是否具有信用卡格式。
  • [Compare]:驗(yàn)證模型中的兩個(gè)屬性是否匹配。
  • [EmailAddress]:驗(yàn)證屬性是否具有電子郵件格式。
  • [Phone]:驗(yàn)證屬性是否具有電話號(hào)碼格式。
  • [Range]:驗(yàn)證屬性值是否在指定的范圍內(nèi)。
  • [RegularExpression]:驗(yàn)證屬性值是否與指定的正則表達(dá)式匹配。
  • [Required]:驗(yàn)證字段是否不為 null。
  • [StringLength]:驗(yàn)證字符串屬性值是否不超過(guò)指定長(zhǎng)度限制。
  • [Url]:驗(yàn)證屬性是否具有 URL 格式。
  • [Remote]:通過(guò)在服務(wù)器上調(diào)用操作方法來(lái)驗(yàn)證客戶端上的輸入。

Error messages

通過(guò)驗(yàn)證特性可以指定要為無(wú)效輸入顯示的錯(cuò)誤消息。 例如:

[Required(ErrorMessage = "名稱不能為空")]

使用自定義返回消息格式

有兩種方式:

  • 使用自定義過(guò)濾器
  • 使用默認(rèn)模型驗(yàn)證,需要在控制器上面加上【ApiController】。

使用自定義過(guò)濾器

首先,創(chuàng)建ModelValidateActionFilterAttribute過(guò)濾器。

public class ModelValidateActionFilterAttribute : ActionFilterAttribute
{
  public override void OnActionExecuting(ActionExecutingContext context)
  {
    if (!context.ModelState.IsValid)
    {
      //獲取驗(yàn)證失敗的模型字段
      var errors = context.ModelState
        .Where(e => e.Value.Errors.Count > 0)
        .Select(e => e.Value.Errors.First().ErrorMessage)
        .ToList();

      var str = string.Join("|", errors);

      //設(shè)置返回內(nèi)容
      var result = new
      {
        Code = 10000,
        Msg = "未通過(guò)數(shù)據(jù)驗(yàn)證。",
        FullMsg = str
      };

      context.Result = new BadRequestObjectResult(result);
    }

  }
}

然后,Startup.ConfigureServices將過(guò)濾器添加到控制器中并關(guān)閉默認(rèn)模型驗(yàn)證,另外我們還添加了AddNewtonsoftJson。

//關(guān)閉默認(rèn)模型驗(yàn)證
services.Configure<ApiBehaviorOptions>(opt => opt.SuppressModelStateInvalidFilter = true);
services.AddControllers(opt =>
{
  //添加過(guò)濾器
  opt.Filters.Add(typeof(ModelValidateActionFilterAttribute));
}).AddNewtonsoftJson(opt =>
{
  //json字符串大小寫(xiě)原樣輸出
  opt.SerializerSettings.ContractResolver = new DefaultContractResolver();
});

最后,我們看一下返回效果:

{
  "Code": 10000,
  "Msg": "未通過(guò)數(shù)據(jù)驗(yàn)證。",
  "FullMsg": "名稱不能為空。"
}

使用默認(rèn)模型驗(yàn)證

services.Configure<ApiBehaviorOptions>(opt =>
{
  opt.InvalidModelStateResponseFactory = actionContext =>
  {
    //獲取驗(yàn)證失敗的模型字段 
    var errors = actionContext.ModelState
      .Where(e => e.Value.Errors.Count > 0)
      .Select(e => e.Value.Errors.First().ErrorMessage)
      .ToList();

    var str = string.Join("|", errors);

    //設(shè)置返回內(nèi)容
    var result = new
    {
      Code = 10000,
      Msg = "未通過(guò)數(shù)據(jù)驗(yàn)證。",
      FullMsg = str
    };

    return new BadRequestObjectResult(result);
  };
});

看完上述內(nèi)容,你們掌握AspNetCore WebApi如何實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI