㈠ webapi是什麼意思
Web API是網路應用程序介面。包含了廣泛的功能,網路應用通過API介面,可以實現存儲服務、消息服務、計算服務等能力,利用這些能力可以進行開發出強大功能的web應用。
存儲服務:存儲服務關注抽象化和虛擬化存儲。這個領域的領頭羊是amazon s3,在我的article in web 2.0journal中對其曾有較深入的探討。對開發者而言,S3提供了極其精簡抽象的如哈希表之類的API,允許你輕松存取信息。另一個有意思的服務是openemy,它提供了類似於文件系統介面的api,但增加了給文件標簽的能力。今年早些時候,TechCrunch剖析了其他一些在線存儲服務。但至今我們還沒看到傳御扮說中顛覆性的存儲服務GDrive(來鎮啟灶自google)和LiveDrive(來自微軟),他們很大可能都會提供api。
計算服務:目前還沒有一個一般的可以通過api訪問的web計算服務黑盒,但有不少技術指向這個方向。一個是alexavertical search platform,在下面的搜索服務小節會提及更多,第二個是網旁嫌格計算,比如 sungrid,datasynapse's gridserver或者platform's symphony。在API里封裝任意的計算任務是個相當具挑戰性的任務,也許還要很多年這種服務才會廣泛流行。
㈡ App 和 Web 的通用介面該怎麼設計
1、在介面定義中確定MVC的GET或者POST方式
由於我們整個Web API平台是基於MVC的基礎上進行的API開發,因此整個Web API的介面,在定義的時候,一般需要顯示來聲明介面是[HttpGet]或者[HttpPost],雖然有些介面也可以不用聲明,但是避免出現類似下面的錯誤信息,顯式聲明還是有好處的。
請求的資源不支持 http 方法「POST
例如在基類定義的查找對象介面如下所示。
/// <summary>
/// 查詢資料庫,檢查是否存在指定ID的對象
/// </summary>
/// <param name="id">對象的ID值</param>
/// <returns>存在則返回指定的對象,否則返回Null</returns>
[HttpGet]
public virtual T FindByID(string id, string token)
如果是增刪改的介面,一般需要聲明為POST方式提交數據,而且基於安全性的考慮,需要攜帶更多的參數。
/// <summary>
/// 插入指定對象到資料庫中
/// </summary>
/// <param name="info">指定的對象</param>
/// <returns>執行操作是否成功。</returns>
[HttpPost]
public virtual CommonResult Insert(T info, string token, string signature, string timestamp, string nonce, string appid)
2、動態對象的介面定義
在一般的Web API介面裡面,我們可能都會碰到很多簡單類型的參數,但是又想讓它們以POST方式提交數據,那麼我們就可以有兩種方法來處理,一種是定義一個類來放置這些參數,一種是採用動態的JObject參數,前者有很多不方便的地方,因為我們不可能為每個介面參數定義多一個實體類,這樣可能會有很多難以管理的類定義。如下面是微信API的調用介面案例,我們也需要設置這樣的處理規則。
介面調用請求說明
http請求方式: POST(請使用https協議)
https://api.weixin.qq.com/cgi-bin/groups/update?access_token=ACCESS_TOKEN
POST數據格式:json
POST數據例子:{"group":{"id":108,"name":"test2_modify2"}}
那麼我們採用JObject是這么樣的呢,我們來看介面的定義和處理代碼。JObject是Newtonsoft.Json.Linq命名空間下的一個對象。
/// <summary>
/// 修改用戶密碼
/// </summary>
/// <param name="param">包含userName和userPassword的復合對象</param>
/// <param name="token">用戶訪問令牌</param>
/// <returns></returns>
[HttpPost]
public CommonResult ModifyPassword(JObject param, string token)
{
//令牌檢查,不通過則拋出異常
CheckResult checkResult = CheckToken(token);
dynamic obj = param;
if (obj != null)
{
string userName = obj.userName;
string userPassword = obj.userPassword;
bool success = BLLFactory<User>.Instance.ModifyPassword(userName, userPassword);
return new CommonResult(success);
}
else
{
throw new MyApiException("傳遞參數出現錯誤");
}
}
其中我們把JObject對象轉換為我們所需要的對象的時候,因為我們沒有定義具體的實體類,因此採用了dynamic語法,聲明這是一個動態對象,由運行時獲取對應的屬性。
dynamic obj = param;
這樣我們就可以在調用的時候,動態POST對應的JSON對象給Web API介面,而不需要預先定義各種介面參數的類了。
/// <summary>
/// 調用Web API介面,修改用戶密碼
/// </summary>
/// <param name="userName">用戶名稱</param>
/// <param name="userPassword">修改的密碼</param>
/// <returns>如果修改成功返回true,否則返回false</returns>
public bool ModifyPassword(string userName, string userPassword)
{
var action = "ModifyPassword";
var postData = new
{
userName = userName,
userPassword = userPassword
}.ToJson();
string url = GetTokenUrl(action);
CommonResult result = JsonHelper<CommonResult>.ConvertJson(url, postData);
return (result != null) ? result.Success : false;
}
其中GetTokenUrl是根據token和API的地址等參數,構建一個完整的提交地址。我們在上面代碼通過
var postData = new
{
userName = userName,
userPassword = userPassword
}.ToJson();
就可以動態創建一個對象,並生成它的JSON字元串,把數據POST提交到對應的API介面裡面即可,然後對結果進行對象的轉換就算完成了。
3、集合和分頁的處理
在很多介面裡面,我們都需要用到分頁的處理,Web API也不例外,這樣可以提交數據檢索效率,減少伺服器數據處理的壓力,同時也提交客戶端的數據顯示速度。
一般的集合介面定義如下所示(通用性基類介面)。
/// <summary>
/// 返回資料庫所有的對象集合
/// </summary>
/// <returns>指定對象的集合</returns>
[HttpGet]
public virtual List<T> GetAll(string token)
{
//檢查用戶是否有許可權,否則拋出MyDenyAccessException異常
base.CheckAuthorized(AuthorizeKey.ListKey, token);
List<T> list = baseBLL.GetAll();
return list;
}
但是這樣的返回記錄會比較多,一般情況下需要分頁,那麼分頁的處理介面定義如下所示。
/// <summary>
/// 根據條件查詢資料庫,並返回對象集合(用於分頁數據顯示)
/// </summary>
/// <returns>指定對象的集合</returns>
[HttpPost]
public virtual PagedList<T> FindWithPager(string condition, PagerInfo pagerInfo, string token)
分頁介面,在這里返回的結果裡面,用了一個PageList的泛型類,這個方便我們獲取當前的記錄及總數,它的定義如下所示。
/// <summary>
/// 分頁集合
/// </summary>
/// <typeparam name="T">對象</typeparam>
public class PagedList<T>
{
/// <summary>
/// 返回記錄的總數
/// </summary>
public int total_count { get; set; }
/// <summary>
/// 列表集合
/// </summary>
public List<T> list { get; set; }
}
最後整個分頁的處理Web API介面實現如下所示。
/// <summary>
/// 根據條件查詢資料庫,並返回對象集合(用於分頁數據顯示)
/// </summary>
/// <returns>指定對象的集合</returns>
[HttpPost]
public virtual PagedList<T> FindWithPager(string condition, PagerInfo pagerInfo, string token)
{
//檢查用戶是否有許可權,否則拋出MyDenyAccessException異常
base.CheckAuthorized(AuthorizeKey.ListKey, token);
List<T> list = baseBLL.FindWithPager(condition, pagerInfo);
//構造成Json的格式傳遞
var result = new PagedList<T>() { total_count = pagerInfo.RecordCount, list = list };
return result;
}
最後客戶端調用分頁的Web API代碼如下所示。
/// <summary>
/// 根據條件查詢資料庫,並返回對象集合(用於分頁數據顯示)
/// </summary>
/// <param name="condition">查詢的條件</param>
/// <param name="pagerInfo">分頁實體</param>
/// <returns>指定對象的集合</returns>
public virtual List<T> FindWithPager(string condition, ref PagerInfo pagerInfo)
{
var action = "FindWithPager";
string url = GetTokenUrl(action) + string.Format("&condition={0}", condition);
var postData = pagerInfo.ToJson();
List<T> result = new List<T>();
PagedList<T> list = JsonHelper<PagedList<T>>.ConvertJson(url, postData);
if (list != null)
{
pagerInfo.RecordCount = list.total_count;//修改總記錄數
result = list.list;
}
return result;
}
4、混合框架界面整合Web API介面
在整個Web API的平台構建以及在混合框架的整合過程中,我把各個模塊還是遵循相對獨立的方式進行開發和整合,它們實現了從直接訪問資料庫、以WCF服務獲取數據,以及通過WebAPI調用方式獲取數據幾種方式的統一,從而實現了整個混合框架的高度整合。
整個混合框架的核心是以相對獨立的方式,整合各個可重用的模塊,我們可以遵循一定的基礎上,快速構建統一的應用平台。
搭建完畢的整個WebAPI平台,其中包括了服務端內容,以API控制器的方式,發布了對應的Web API介面。
在每個混合框架的獨立模塊裡面,我們封裝了對應的Web API客戶端調用處理,從而實現了Web API的調用方式。
在Win10下,使用Web API模式運行混合框架,獲得的主體界面效果如下所示。
獨立模塊許可權管理系統界面如下所示。
系列文章如下所示:
Web API應用架構在Winform混合框架中的應用(1)
Web API應用架構在Winform混合框架中的應用(2)--自定義異常結果的處理
Web API介面設計經驗總結
Web API應用架構在Winform混合框架中的應用(3)--Winfrom界面調用WebAPI的過程分解
Web API應用架構在Winform混合框架中的應用(4)--利用代碼生成工具快速開發整套應用
Web API應用架構在Winform混合框架中的應用(5)--系統級別字典和公司級別字典並存的處理方式
㈢ 有哪些webapi開發好用的工具
先定義一個簡單的webapi,簡單到差不多直接用vs2010自動生成的webapi代碼。其中的TestModle是一個簡單的class,如下public class TestModle { public string a { get; set; } public string b { get; set; } public string c { get; set; } }
㈣ WebApi 2 路由機制
.net中包含的路由有兩種,第一種是MVC模式的按url匹配action,第二種是WebApi模式的按http請求的方法匹配action,本文我們學習WebApi的路由模式。
首先新建一個WebApi項目,選擇ASP.NET Web應用程序(.NET Framework)
這里我們首先來看WebApi的基礎配置 WebApiConfig.cs ,其路徑為 /App_Start/WebApiConfig.cs
首先以瀏覽器啟動webapi項目
會發現頁面顯示403,這是很正常的,因為我們在新建項目的時候沒有加入MVC,所以沒有可視化的view頁面,不過我們卻拿到了這個項目的 埠號
為了更加方便直觀的看我們的介面請求,我們選擇postman,首先在項目新建一個 controller
通過以上的操作,我們就搭建好了一個webApi2的項目工程,後面我們就在這個工程的基礎上進行webApi 2的開發和學習。
webApi的路由過程主要經歷了如下三步
WebApiConfig.cs 這個文件是進行路由表的核心文件, WebApiConfig 裡面只有一個方法,這個方法在 Global.asax 文件里的 Application_Start() 方法被調用, Global.asax 文件是一個全局文件,當我們網頁啟動時就會去執行它。 Register(HttpConfiguration config) 方法是配置WEB API路由的。
因此 在webAP工程啟動的時候,會執行 Global.asax ,這個文件裡面注冊了 WebApiConfig.cs 的一系列初始化配置,從而實現了webapi。
WebApi 2 框架使用路由表。 並由Web API 的 Visual Studio 項目模板創建默認路由
轉到 MapHttpRoute 的定義,可以看到它有4個重載
分別來看看各個參數的作用
webApi2工程自動為我們創建了默認的路由
經過上面的講解,我們知道了匹配的URL是 api/{controller}/{id}
那麼我們在實際的請求中應該如何請求
新建一個 StudentsController
依次對以下地址進行請求
總結:
默認路由的缺點
如下
添加如下的方法(action)
得到了一下的結果
我們來看看這個請求是如何進行匹配的,首先找到 /App_Start/WebApiConfig.cs
按照路由模板來看,我們請求的路由沒有 action 名稱,那麼它是怎麼進行匹配的呢?
其實當我們訪問 http://localhost:65066/api/student 這個url的時候,webapi會自動去匹配 api/{controller}/{id} 這個模板,在這個路徑中,student是controller,那麼它又是怎麼去找到 getStudentName 這個action的呢?明明我們都沒有傳action這個參數,其實Webapi的路由規則是通過http方法去匹配對應的action,我們請求這個地址是用的 GET 方法,那麼webapi會找Order這個控制器裡面的get請求的方法,同事我們的這個 getStudentName 是以 get 開頭的,它符合了webapi的匹配規則,於是就請求成功了,但前提是你寫的方法必須是以get開頭的,如果當前這個controller一個get開頭的都沒有,那麼就顯示 請求的資源不支持 http 方法「GET」 。
當然不以get開頭的前提是你必須加上 [HttpGet] 這個特性,webapi才知道你這個是get的請求方法,就能正確進行匹配。
然後我們再回到 /App_Start/WebApiConfig.cs ,看下裡面 MapHttpRoute 的各個參數的含義,首先轉到它的定義,發現它是 HttpRouteCollection 的擴展方法, MapHttpRoute 有4類重載
在 WebApiConfig.cs 裡面修改為如下的路由模板
介面請求如下
通過 action 的名稱來匹配很好理解,上面的 StudentName() 是方法名, webApi 會默認它就是 action 的名稱,如果你想要方法名和 action 的名稱不一致,你也可以自定義 action 的名稱,這個可以通過特性 ActionName 來實現,如下:
首先看路由模板
對於同請求類型,同請求參數的請求,會出現 不傳參數,找不到匹配的資源 或 傳了參數,但是找到了與該請求匹配的多個操作 的問題,如下所示
解決以上的辦法有兩種
如果要使用特性路由,首先在 WebApiConfig.cs 的 Register 方法裡面必須先啟用特性路由(一般情況下,當我們新建一個 WebApi 項目的時候,會自動在 Register 方法裡面加上這句話。)
特性路由的目的是為了解決我們公共路由模板引擎解決不了的問題。一個action定義了特性路由之後,就能通過特性路由上面的路由規則找到。
只要出現了特性路由,匹配的規則是按特性路由來的
修改studentController如下
參考
參考
路由前綴的一般的做法是在控制器上面使用特性 [RoutePrefix] 來標識。
但是需要注意路由前綴不能以 / 開頭
㈤ 如何使用mvc實現webapi的增刪改查
1.創建項目:visual C# —> ASP.NET MVC 4 web應用程序 模板—>web api;
2.注冊路由:
路由表中的每一個條目都包含一個路由模板。這個Web API默認的路由模版是"api/{controller}/{id}"。在這個模版中,「api」是一個文字式路徑片段,而{controller}和{id}則是佔位符變數。
當Web API框架接收一個HTTP請求時,它會試圖根據路由表中的一個路由模板來匹配其URI。如果無路由匹配,客戶端會接收到一個404(未找到)錯誤。
3.linq to sql連接資料庫
1.建立資料庫建表
2.在models文件夾裡面新建linq to sql類文件
3.工具->連接到資料庫
4.將要用的表拖入設計區
5.獲取資料庫Getway。"linq to sql class"文件名+Datacontext實例化這個對象,數據表就會映射到一個集合屬性中,personDataDataContext db = new personDataDataContext();
6.增刪改查
增:
public Boolean Post([FromBody]UserInfo userInfo) {
personDataDataContext db = new personDataDataContext();
var s1 = new test2
{
UserName =userInfo.UserName, Id=userInfo.Id, Age=userInfo.Age
};
if (db.test2.SingleOrDefault<test2>(s => s.Id == userInfo.Id) == null)
{
db.test2.InsertOnSubmit(s1);
db.SubmitChanges();
return true;
} else {
return false;
}
}
刪:
public bool Delete(int id)
{
personDataDataContext db = new personDataDataContext();
var deleteperson = db.test2.SingleOrDefault<test2>(s => s.Id == id);
if (deleteperson == null)
{
return false;
} else {
db.test2.DeleteOnSubmit(deleteperson);
db.SubmitChanges();
return true;
}
}
改:
public Boolean Put(int id, [FromBody]UserInfo userInfo)
{
personDataDataContext db = new personDataDataContext();
var editperson = db.test2.SingleOrDefault<test2>(s => s.Id == userInfo.Id);
if (editperson == null)
{
return false;
} else {
editperson.Age = userInfo.Age;
editperson.UserName = userInfo.UserName;
db.SubmitChanges();
return true;
}
查:
public IEnumerable<test2> Get()
{
personDataDataContext db = new personDataDataContext();
var query = from s in db.test2
orderby s.UserName
select s;
return query;
}
// GET api/values/5
public string Get(int id)
{
return "value";
}
這里我新建了一個userinfo類
public class UserInfo { public string UserName { get; set; } public int Id { get; set; } public int Age { get; set; } }
用來接收前端頁面ajax請求中的data數據,s => s.Id == userInfo.Id是lamda表達式創建委託方法意思是在db.test2的person集合中查找某個person的Id與userinfo接收到的id相等的person對象
㈥ asp.net mvc3 項目怎麼開發API介面
Visual Studio為我們提供了專門用於創建ASP.NET Web API應用的項目模板,藉助於此項目模板提供的向導,我們可以「一鍵式」創建一個完整的ASP.NET Web API項目。在項目創建過程中,Visual Studio會自動為我們添加必要的程序集引用和配置,甚至會為我們自動生成相關的代碼,總之一句話:這種通過向導生成的項目在被創建之後其本身就是一個可執行的應用。
對於IDE提供的這種旨在提高生產效率的自動化機制,我個人自然是推崇的,但是我更推薦讀者朋友們去了解一下這些自動化機制具體為我們做了什麼?做這些的目的何在?哪些是必需的,哪些又是不必要的?正是基於這樣的目的,在接下來演示的實例中,我們將摒棄Visual Studio為我們提供的向導,完全在創建的空項目中編寫我們的程序。這些空項目體現在如右圖所示的解決方案結構中。
如右圖所示,整個解決方案一共包含6個項目,上面介紹的作為「聯系人管理器」的單頁Web應用對應著項目WebApp,下面的列表給出了包括它在內的所有項目的類型和扮演的角色。
·Common:這是一個空的類庫項目,僅僅定義了表示聯系人的數據類型而已。之所以將數據類型定義在獨立的項目中,只要是考慮到它會被多個項目(WebApi和ConsoleApp)所使用。
WebApi:這是一個空的類庫項目,表現為HttpController類型的Web API就定義在此項目中,它具有對Common的項目引用。
WebHost:這是一個空的ASP.NET Web應用,它實現了針對ASP.NET Web API的Web Host寄宿,該項目具有針對WebApi的項目引用。
SelfHost:這是一個空的控制台應用,旨在模擬ASP.NET Web API的Self Host寄宿模式,它同樣具有針對WebApi的項目引用。
WebApp:這是一個空的ASP.NET Web應用,代表「聯系人管理器」的網頁就存在於該項目之中,至於具體的聯系人管理功能,自然通過以Ajax的形式調用Web API來完成。
ConsoleApp:這是一個空的控制台應用,我們用它來模擬如何利用客戶端代理來實現對Web API的遠程調用,它具有針對Common的項目引用。
二、定義Web API
在正式定義Web API之前,我們需要在項目Common中定義代表聯系人的數據類型Contact。簡單起見,我們僅僅為Contact定義了如下幾個簡單的屬性,它們分別代表聯系人的ID、姓名、聯系電話、電子郵箱和聯系地址。
1: public class Contact
2: {
3: public string Id { get; set; }
4: public string Name { get; set; }
5: public string PhoneNo { get; set; }
6: public string EmailAddress { get; set; }
7: public string Address { get; set; }
8: }
表現為HttpController的Web API定義在WebApi項目之中,我們一般將ApiController作為繼承的基類。ApiController定義在「System.Web.Http.dll」程序集中,我們可以在目錄「%ProgramFiles%\Microsoft ASP.NET\ASP.NET Web Stack 5\Packages\」中找到這個程序集。具體來說,該程序集存在於子目錄「Microsoft.AspNet.WebApi.Core.5.0.0\lib\net45」中。
Web API體現在如下所示的ContactsController類型中。在該類型中,我們定義了Get、Post、Put和Delete這4個Action方法,它們分別實現了針對聯系人的查詢、添加、修改和刪除操作。Action方法Get具有一個表示聯系人ID的可預設參數,如果該參數存在則返回對應的聯系人,否則返回整個聯系人列表。由於ASP.NET Web API默認實現了Action方法與HTTP方法的映射,所以方法名也體現了它們各自所能處理請求必須採用的HTTP方法。
1: public class ContactsController: ApiController
2: {
3: static List<Contact> contacts;
4: static int counter = 2;
5:
6: static ContactsController()
7: {
8: contacts = new List<Contact>();
9: contacts.Add(new Contact { Id = "001", Name = "張三",
10: PhoneNo = "0512-12345678", EmailAddress = "[email protected]",
11: Address = "江蘇省蘇州市星湖街328號" });
12: contacts.Add(new Contact { Id = "002", Name = "李四",
13: PhoneNo = "0512-23456789", EmailAddress = "[email protected]",
14: Address = "江蘇省蘇州市金雞湖大道328號" });
15: }
16:
17: public IEnumerable<Contact> Get(string id = null)
18: {
19: return from contact in contacts
20: where contact.Id == id || string.IsNullOrEmpty(id)
21: select contact;
22: }
23:
24: public void Post(Contact contact)
25: {
26: Interlocked.Increment(ref counter);
27: contact.Id = counter.ToString("D3");
28: contacts.Add(contact);
29: }
30:
31: public void Put(Contact contact)
32: {
33: contacts.Remove(contacts.First(c => c.Id == contact.Id));
34: contacts.Add(contact);
35: }
36:
37: public void Delete(string id)
38: {
39: contacts.Remove(contacts.First(c => c.Id == id));
40: }
41: }
簡單起見,我們利用一個靜態欄位(contacts)表示存儲的聯系人列表。當ContactsController類型被載入的時候,我們添加了兩個ID分別為「001」和「002」的聯系人記錄。至於實現聯系人CRUD操作的Action方法,我們也省略了必要的驗證,對於本書後續的演示的實例,我們基本上也會採用這種「簡寫」的風格。
㈦ 如何使 WebAPI 自動生成漂亮又實用在線API文檔
1.1 SwaggerUI
SwaggerUI 是一個簡單的Restful API 測試和文檔工具。簡單、漂亮、易用(官方demo)。通過讀取JSON 配置顯示API. 項目本身僅僅也只依賴一些 html,css.js靜態文件. 你可以幾乎放在任何Web容器上使用。
1.2 Swashbuckle
Swashbuckle 是.NET類庫,可以將WebAPI所有開放的控制器方法生成對應SwaggerUI的JSON配置。再通過SwaggerUI 顯示出來。類庫中已經包含SwaggerUI 。所以不需要額外安裝。
2.快速開始
創建項目 OnlineAPI來封裝網路音樂服務(示例下載) ,通過API可以搜索、獲取音樂的信息和播放連接。
我盡量刪除一些我們demo中不會用到的一些文件,使其看上去比較簡潔。
WebAPI 安裝 Swashbuckle
Install-Package Swashbuckle
代碼注釋生成文檔說明。
Swashbuckle 是通過生成的XML文件來讀取注釋的,生成 SwaggerUI,JSON 配置中的說明的。
安裝時會在項目目錄 App_Start 文件夾下生成一個 SwaggerConfig.cs 配置文件,用於配置 SwaggerUI 相關展示行為的。如圖:
將配置文件大概99行注釋去掉並修改為
c.IncludeXmlComments(GetXmlCommentsPath(thisAssembly.GetName().Name));
並在當前類中添加一個方法
/// <summary>
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
protected static string GetXmlCommentsPath(string name)
{
return string.Format(@"{0}\bin\{1}.XML", AppDomain.CurrentDomain.BaseDirectory, name);
}
緊接著你在此Web項目屬性生成選卡中勾選 「XML 文檔文件」,編譯過程中生成類庫的注釋文件
添加網路音樂 3個API
訪問 http://<youhost>/swagger/ui/index,最終顯示效果
我們通過API 測試API 是否成功運行
3.添加自定義HTTP Header
在開發移動端 API時常常需要驗證許可權,驗證參數放在Http請求頭中是再好不過了。WebAPI配合過濾器驗證許可權即可
首先我們需要創建一個 IOperationFilter 介面的類。IOperationFilter
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Http.Description;
using System.Web.Http.Filters;
using Swashbuckle.Swagger;
namespace OnlineAPI.Utility
{
public class HttpHeaderFilter : IOperationFilter
{
public void Apply(Operation operation, SchemaRegistry
schemaRegistry, ApiDescription apiDescription)
{
if (operation.parameters == null) operation.parameters = new
List<Parameter>();
var filterPipeline =
apiDescription.ActionDescriptor.GetFilterPipeline();
//判斷是否添加許可權過濾器
var isAuthorized = filterPipeline.Select(filterInfo =>
filterInfo.Instance).Any(filter => filter is IAuthorizationFilter);
//判斷是否允許匿名方法
var allowAnonymous =
apiDescription.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any();
if (isAuthorized && !allowAnonymous)
{
operation.parameters.Add(new Parameter
{
name = "access-key",
@in = "header",
description = "用戶訪問Key",
required = false,
type = "string"
});
}
}
}
}
在 SwaggerConfig.cs 的 EnableSwagger 配置匿名方法類添加一行注冊代碼
c.OperationFilter<HttpHeaderFilter>();
添加Web許可權過濾器
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Web;
using System.Web.Http;
using System.Web.Http.Controllers;
using Newtonsoft.Json;
namespace OnlineAPI.Utility
{
/// <summary>
///
/// </summary>
public class AccessKeyAttribute : AuthorizeAttribute
{
/// <summary>
/// 許可權驗證
/// </summary>
/// <param name="actionContext"></param>
/// <returns></returns>
protected override bool IsAuthorized(HttpActionContext actionContext)
{
var request = actionContext.Request;
if (request.Headers.Contains("access-key"))
{
var accessKey = request.Headers.GetValues("access-key").SingleOrDefault();
//TODO 驗證Key
return accessKey == "123456789";
}
return false;
}
/// <summary>
/// 處理未授權的請求
/// </summary>
/// <param name="actionContext"></param>
protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
{
var content = JsonConvert.SerializeObject(new {State = HttpStatusCode.Unauthorized});
actionContext.Response = new HttpResponseMessage
{
Content = new StringContent(content, Encoding.UTF8, "application/json"),
StatusCode = HttpStatusCode.Unauthorized
};
}
}
}
在你想要的ApiController 或者是 Action 添加過濾器
[AccessKey]
最終顯示效果
4.顯示上傳文件參數
SwaggerUI 有上傳文件的功能和添加自定義HTTP Header 做法類似,只是我們通過特殊的設置來標示API具有上傳文件的功能
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http.Description;
using Swashbuckle.Swagger;
namespace OnlineAPI.Utility
{
/// <summary>
///
/// </summary>
public class UploadFilter : IOperationFilter
{
/// <summary>
/// 文件上傳
/// </summary>
/// <param name="operation"></param>
/// <param name="schemaRegistry"></param>
/// <param name="apiDescription"></param>
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
if (!string.IsNullOrWhiteSpace(operation.summary) && operation.summary.Contains("upload"))
{
operation.consumes.Add("application/form-data");
operation.parameters.Add(new Parameter
{
name = "file",
@in = "formData",
required = true,
type = "file"
});
}
}
}
}
在 SwaggerConfig.cs 的 EnableSwagger 配置匿名方法類添加一行注冊代碼
c.OperationFilter<UploadFilter>();
API 文檔展示效果