DotNet Web Api開發(fā)Restful Api相關

DotNet Web Api開發(fā)Restful Api相關

開發(fā)環(huán)境

  • Visual Studio 2015
  • .Net Framework 4.5
  • Web Api
image

統(tǒng)一返回結果

Restful Api 的返回結果基本上使用的是 JSON 格式化戳,在 .Net Web Api 中默認的是返回 XML 格式,需要修改一下返回的結果的格式

  • 統(tǒng)一配置返回 JSON 格式

WebApiConfig中清除其他的格式新荤,并添加 JSON 格式

config.Formatters.Clear();
config.Formatters.Add(new JsonMediaTypeFormatter());

也可以去除 XML 格式

config.Formatters.Remove(config.Formatters.XmlFormatter);

還可以配置 JSON 數(shù)據(jù)的格式

縮進

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;

駝峰式大小寫

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
  • 自定義返回結果
public static HttpResponseMessage toJson( System.Net.HttpStatusCode code, Result result)
{
    var response = Newtonsoft.Json.JsonConvert.SerializeObject(result);
    HttpResponseMessage res = new HttpResponseMessage(code);
    res.Content = new StringContent(response, Encoding.UTF8, "application/json");
    return res;
}

統(tǒng)一的返回結果數(shù)據(jù)格式,對于 null添加注解 [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 數(shù)據(jù)可以選擇忽略担锤,不返回給客戶端

public class Result
{
    /// <summary>
    /// 錯誤信息
    /// </summary>
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string err;
    /// <summary>
    /// 具體的數(shù)據(jù)
    /// </summary>
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public object data;


    public Result(string err,object data)
    {
        this.err = err;
        this.data = data;
    }
}
  • 使用 篩選器 ActionFilterAttribute 統(tǒng)一處理返回結果
public class ResultFilterAttribute : ActionFilterAttribute
{
    //在Action處理完相關的數(shù)據(jù)之后不翩,會在經(jīng)過這個方法處理
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        if (actionExecutedContext.ActionContext.Response != null)
        {
            var data = actionExecutedContext.ActionContext.Response.Content.ReadAsAsync<object>().Result;
            Result result = new Result(null, data);
            HttpResponseMessage message = Utils.toJson(System.Net.HttpStatusCode.OK result);
            actionExecutedContext.Response = message;
        }
    }
}

對應的 ControllerAction 添加對應的注解

[HttpGet]
[ResultFilter]
public IHttpActionResult AllCategory()
{
    IEnumerable<CategoryModel> result  = _service.GetAllCategory();//具體的數(shù)據(jù)
    return Ok(result);
}

參數(shù)檢查驗證

在進行請求接口時齿诞,需要先對提交的數(shù)據(jù)參數(shù)做一些驗證衡便,驗證數(shù)據(jù)的合法性献起,如果不合法就不再通過action,直接返回給客戶端處理镣陕。

使用FluentValidation做參數(shù)驗證

  • 配置 FluentValidation

使用Nuget安裝 FluentValidation.WebApi

需要驗證的數(shù)據(jù)model

[Validator(typeof(UserReqValidator))]
public class UserReq
{
    public string username;
    public string password;
}

public class UserReqValidator : AbstractValidator<UserReq>
{
    public UserReqValidator()
    {
        RuleFor(m => m.username).NotEmpty().NotNull().WithMessage("用戶名不能為空");
        RuleFor(m => m.password).NotEmpty().NotNull().MinimumLength(8).WithMessage("密碼不能為空谴餐,長度至少是8位");
    }
}

FluentValidation 生效,在 WebApiConfig中添加如下配置

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        ...
        FluentValidationModelValidatorProvider.Configure(config);
    }
}
  • 請求驗證
public class ParamsFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (!actionContext.ModelState.IsValid)
        {
            var result = new Result("參數(shù)非法", null);
            actionContext.Response = Utils.toJson(System.Net.HttpStatusCode.BadRequest, result);
        }
    }
}

對應的 ControllerAction 添加對應的注解,如果參數(shù)請求的參數(shù)非法呆抑,就會直接返回給客戶端岂嗓,就不會在經(jīng)過對用的Action


[HttpPost]
[ParamsFilter]
[ResultFilter]
public IHttpActionResult CategoryLevel([FromBody] UserReq req)
{
    var ids = _service.GetQuestionIdsByLevel(req);
    var result = _questionService.GetQuestionByIds(ids);
    return Ok(result);
}

統(tǒng)一異常處理

自定義異常數(shù)據(jù)結構

public class ApiException : Exception
{
    public int code;
    public string msg;

    public ApiException(int code,string msg)
    {
        this.code = code;
        this.msg = msg;
    }
}

定義 異常篩選器 ExceptionFilterAttribute

public class ApiExceptionAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext actionExecutedContext)
    {
        if(actionExecutedContext.Exception is ApiException)
        {
            var ex = (ApiException)actionExecutedContext.Exception;
            var result = new Result(ex.code, ex.msg, null);
            actionExecutedContext.ActionContext.Response = Utils.toJson(result);
        }else
        {
            var ex = actionExecutedContext.Exception;
            var result = new Result((int)Error.ReturnValue.內部錯誤, ex.Message, null);
            actionExecutedContext.ActionContext.Response = Utils.toJson(result);
        }
    }
}

對應的 ControllerAction 添加對應的注解,或者全局配置

swagger

使用 Nuget 安裝 Swashbuckle 已經(jīng)自帶了UI

SwaggerConfig中配置對應的XML路徑

c.IncludeXmlComments(GetXmlCommentsPath());

...

protected static string GetXmlCommentsPath()
{
    return System.String.Format(@"{0}\bin\對應的項目名稱.XML", System.AppDomain.CurrentDomain.BaseDirectory);
}

配置好之后,訪問 http://localhost:63380/swagger 就能看多對應的UI鹊碍,可以直接測試對應的接口

swagger 配置 Authorization

SwaggerConfig中配置

c.ApiKey("apiKey")
                            .Description("API Key Authentication")
                            .Name("Authorization")
                            .In("header");
c.EnableApiKeySupport("Authorization", "header");
image
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末厌殉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子侈咕,更是在濱河造成了極大的恐慌公罕,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耀销,死亡現(xiàn)場離奇詭異楼眷,居然都是意外死亡,警方通過查閱死者的電腦和手機熊尉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門罐柳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人狰住,你說我怎么就攤上這事张吉。” “怎么了转晰?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵芦拿,是天一觀的道長士飒。 經(jīng)常有香客問我,道長蔗崎,這世上最難降的妖魔是什么酵幕? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮缓苛,結果婚禮上芳撒,老公的妹妹穿的比我還像新娘。我一直安慰自己未桥,他們只是感情好笔刹,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著冬耿,像睡著了一般舌菜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上亦镶,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天日月,我揣著相機與錄音,去河邊找鬼缤骨。 笑死爱咬,一個胖子當著我的面吹牛,可吹牛的內容都是我干的绊起。 我是一名探鬼主播精拟,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼虱歪!你這毒婦竟也來了蜂绎?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤实蔽,失蹤者是張志新(化名)和其女友劉穎荡碾,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體局装,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡坛吁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了铐尚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拨脉。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖宣增,靈堂內的尸體忽然破棺而出玫膀,到底是詐尸還是另有隱情,我是刑警寧澤爹脾,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布帖旨,位于F島的核電站箕昭,受9級特大地震影響,放射性物質發(fā)生泄漏解阅。R本人自食惡果不足惜落竹,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望货抄。 院中可真熱鬧述召,春花似錦、人聲如沸蟹地。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怪与。三九已至夺刑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間琼梆,已是汗流浹背性誉。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工窿吩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茎杂,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓纫雁,卻偏偏與公主長得像煌往,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子轧邪,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理刽脖,服務發(fā)現(xiàn),斷路器忌愚,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,806評論 6 342
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架曲管,建立于...
    Hsinwong閱讀 22,394評論 1 92
  • 嗯 唯一看順眼的小鮮肉啊
    呶呶的簡書閱讀 266評論 0 0
  • 結束了一段感情,開啟了一程說走就走的旅行硕糊,一個人院水,3700公里~我背包獨行! 中國地圖只剩下重慶简十,貴州檬某,江西,安徽...
    愛溜達的螃蟹閱讀 273評論 0 0