日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WebApiClient的接口输入验证

發布時間:2023/12/4 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WebApiClient的接口输入验证 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 文章目的

隨著WebApiClient的不斷完善,越來越多開發者選擇WebApiClient替換原生的HttpClient,本文將介紹WebApiClient的接口參數輸入有效性驗證的新特性。

2.DataAnnotations介紹

在asp.net mvc服務端編程中,我們在創建模型的時候,使用System.ComponentModel.DataAnnotations相關的驗證特性,配合mvc框架,可以做前端和后端雙向輸入驗證的效果。

public class UserInfo{ ? ?[Required] ? ?[StringLength(10, MinimumLength = 1)] ? ?

? ?public string Account { get; set; } ? ?[Required] ? ?[StringLength(10, MinimumLength = 6)] ?

? ?public string Password { get; set; } }

以上的Required就是驗證特性,asp.net mvc在模型綁定的時候,會進行驗證一遍,驗證結果放在控制器的ModelState屬性里面。當然System.ComponentModel.DataAnnotations并不是asp.net mvc特有的,而是基礎庫自帶的,也就是說任何框架下都是可以使用的。

3. 接口參數值的輸入驗證

Validator靜態類提ValidateObject相關的方法,用于驗證實例和實例的屬性值,WebApiClient使用Validator類來完成接口方法的參數值輸入驗證:

/// <summary>

/// 提供參數值和參數的屬性值輸入合法性驗證

/// </summary>

static class ParameterValidator

{

? ? /// <summary>

? ? /// 類型的屬性否需要驗證緩存

? ? /// </summary>

? ? private static readonly ConcurrentCache<Type, bool> cache = new ConcurrentCache<Type, bool>();


? ? /// <summary>

? ? /// 返回是否需要進行屬性驗證

? ? /// </summary>

? ? /// <param name="instance">實例</param>

? ? /// <returns></returns>

? ? private static bool IsNeedValidateProperty(object instance)

? ? {

? ? ? ? if (instance == null)

? ? ? ? {

? ? ? ? ? ? return false;

? ? ? ? }


? ? ? ? var type = instance.GetType();

? ? ? ? if (type == typeof(string) || type.GetTypeInfo().IsValueType == true)

? ? ? ? {

? ? ? ? ? ? return false;

? ? ? ? }


? ? ? ? return cache.GetOrAdd(type, t => t.GetProperties().Any(p => p.CanRead && p.IsDefined(typeof(ValidationAttribute), true)));

? ? }


? ? /// <summary>

? ? /// 驗證參數值輸入合法性

? ? /// 驗證參數的屬性值輸入合法性

? ? /// </summary>

? ? /// <param name="parameter">參數描述</param>

? ? /// <param name="validateProperty">是否驗證屬性值</param>

? ? /// <exception cref="ValidationException"></exception>

? ? public static void Validate(ApiParameterDescriptor parameter, bool validateProperty)

? ? {

? ? ? ? var name = parameter.Name;

? ? ? ? var instance = parameter.Value;


? ? ? ? foreach (var validation in parameter.ValidationAttributes)

? ? ? ? {

? ? ? ? ? ? validation.Validate(instance, name);

? ? ? ? }


? ? ? ? if (validateProperty == true && IsNeedValidateProperty(instance) == true)

? ? ? ? {

? ? ? ? ? ? var ctx = new ValidationContext(instance) { MemberName = name };

? ? ? ? ? ? Validator.ValidateObject(instance, ctx, true);

? ? ? ? }

? ? }

}

4.接口參數的DataAnnotations聲明

4.1 聲明參數值的驗證

例如GetByIdAsync方法有個id的參數,服務器要求必填且最大長度為10的字符串,我們可以使用Required, StringLength(10)特性修飾id這個參數,在接口調用時,WebApiClient會對id值進行驗證,如果不通過則拋出ValidationException的異常。

// /GET webapi/user/GetById?id=id001

// Return HttpResponseMessage

[HttpGet("webapi/user/GetById/{id}")]

[BasicAuth("userName", "password")]

ITask<HttpResponseMessage> GetByIdAsync(

? ? [Required, StringLength(10)] string id);

4.2 聲明參數值的屬性驗證

對于自定義的模型類型,只要在屬性里聲明了相關的DataAnnotations,WebApiClient就自動進行屬性的輸入驗證。

public class UserInfo

{

? ? [Required]

? ? [StringLength(10, MinimumLength = 1)]

? ? public string Account { get; set; }


? ? [Required]

? ? [StringLength(10, MinimumLength = 6)]

? ? public string Password { get; set; }

}


// POST webapi/user/UpdateWithJson

// Body {"Account":"laojiu","Password":"123456"}

// Return json或xml內容

[HttpPost("webapi/user/UpdateWithJson")]

ITask<UserInfo> UpdateWithJsonAsync(

? ? [JsonContent("yyyy-MM-dd HH:mm:ss")] UserInfo user);

當user參數不為null的情況,就會驗證它的Account和Password兩個屬性。

4.3 聲明參數值、參數的屬性值同時驗證

對于4.2的例子,如果我們希望user參數值也不能為null,可以如下聲明方法:

// POST webapi/user/UpdateWithJson// Body {"Account":"laojiu","Password":"123456"} // Return json或xml內容 [HttpPost("webapi/user/UpdateWithJson")]ITask<UserInfo> UpdateWithJsonAsync([Required][JsonContent("yyyy-MM-dd HH:mm:ss")] UserInfo user);

5. 禁用參數的屬性驗證

如果你的模型的屬性已聲明驗證特性,但不希望WebApiClient進行屬性值驗證,可以在創建接口實例的時候,在配置項里禁用屬性驗證:

var config = new HttpApiConfig {UseParameterPropertyValidate = false};var client = HttpApiClient.Create<IUserApi>(config);

6. 結束語

博主為WebApiClient庫的作者,本文向讀者介紹了DataAnnotations驗證特性在WebApiCiient下的使用方法,歡迎大家給WebApiClient提建議。

原文地址https://www.cnblogs.com/kewei/p/9406201.html

.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com

總結

以上是生活随笔為你收集整理的WebApiClient的接口输入验证的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。