一、如何新建一個webApi項目
打開VS→找到解決方案→新建項目→類庫或web應用程序→選擇空的WebApi項目→在Global.asax文件的Application_Start方法中注冊WebApi的相關配置→完成
二、如何對外提供api接口
在webApi項目的Controllers文件夾下新增一個類繼承ApiController,在該類中就可以完成對外接口(GET、POST、PUT、DELETE等),需要注意的是如果提供的方法需要參數,則參數的類型不能按它實際的類型聲明和傳遞,如Name不能直接聲明為string類型,否則調用該接口時會報404錯誤,找不到該訪問地址。聲明的方式有很多種:
(1)創建一個類,該類只包含該方法所需的參數。
(2)引用FormDataCollection類來聲明和接收參數。
這是常用的聲明方式,推薦方法(2)。下面用例子的形式說明錯誤寫法和正確寫法
1 #region 參數聲明示例·錯誤寫法 2 [Route("Example")] 3 [HttpPost] 4 public object Example(string name) 5 { 6 var response = new ResponseModel 7 { 8 StatusCode = 200, 9 Message = "接收數據成功!", 10 Data = name 11 }; 12 return Json(response); 13 } 14 #endregion
1 #region 參數聲明示例·正確寫法 2 [Route("Example")] 3 [HttpPost] 4 public object Example(FormDataCollection collection) 5 { 6 var name = collection.Get("name"); 7 var response = new ResponseModel 8 { 9 StatusCode = 200, 10 Message = "接收數據成功!", 11 Data = name 12 }; 13 return Json(response); 14 } 15 #endregion
1 #region 參數聲明示例·正確寫法 2 [Route("Example")] 3 [HttpPost] 4 public object Example(DataInfo data) 5 { 6 var response = new ResponseModel 7 { 8 StatusCode = 200, 9 Message = "接收數據成功!", 10 Data = data.Name 11 }; 12 return Json(response); 13 } 14 #endregion 15 16 public class DataInfo 17 { 18 public string Name { get; set; } 19 }
三、自定義票據驗證篩選器
(1)創建類 AuthorFilter 繼承 AuthorizeAttribute
1 using System; 2 using System.Configuration; 3 using System.Web; 4 using System.Web.Http; 5 using System.Web.Http.Controllers; 6 using System.Web.Security; 7 using Xryang.Core.Config; 8 9 namespace Xryang.Api.Author 10 { 11 public class AuthorFilter : AuthorizeAttribute 12 { 13 public override void OnAuthorization(HttpActionContext actionContext) 14 { 15 #region 驗證token → 請求數據 16 var content = actionContext.Request.Properties["MS_HttpContext"] as HttpContextBase; 17 var token = content.Request.Headers["Secret"]; 18 if (!string.IsNullOrEmpty(token)) 19 { 20 //驗證token 21 if (ValidateTicket(token)) 22 { 23 base.IsAuthorized(actionContext); 24 } 25 else 26 { 27 HandleUnauthorizedRequest(actionContext); 28 } 29 return; 30 } 31 #endregion 32 33 #region 請求token 34 var appId = content.Request.Headers["AppId"]; 35 if (!string.IsNullOrEmpty(appId)) 36 { 37 //驗證AppId 38 if (IsAllowAppId(appId)) 39 { 40 base.IsAuthorized(actionContext); 41 } 42 else 43 { 44 HandleUnauthorizedRequest(actionContext); 45 } 46 return; 47 } 48 #endregion 49 50 #region 非法請求 51 HandleUnauthorizedRequest(actionContext); 52 #endregion 53 } 54 55 #region 驗證Token 56 //校驗票據(數據庫數據匹配) 57 private bool ValidateTicket(string token) 58 { 59 bool flag = false; 60 try 61 { 62 //解密Token 63 var ticket = FormsAuthentication.Decrypt(token).UserData; 64 if (ticket.Equals("token示例")) 65 flag = true; 66 } 67 catch (Exception ex) 68 { 69 70 } 71 return flag; 72 } 73 #endregion 74 75 #region 驗證AppId 76 private bool IsAllowAppId(string appId) 77 { 78 var config = ConfigurationManager.GetSection("XryangConfig") as XryangConfig; 79 if (string.IsNullOrEmpty(appId) || string.IsNullOrEmpty(config.AppId)) return false; 80 if (appId.Equals(config.AppId)) return true; 81 return false; 82 } 83 #endregion 84 } 85 }
(2)在api控制器或方法上加上 [AuthorFilter] 即可
1 using System; 2 using System.Net.Http.Formatting; 3 using System.Web.Http; 4 using System.Web.Security; 5 using Xryang.Api.Author; 6 using Xryang.Model.Commons; 7 8 namespace Xryang.Api.Controllers 9 { 10 [AuthorFilter] 11 [RoutePrefix("Api/App")] 12 public class AppController : ApiController 13 { 14 15 #region 獲取token 16 [Route("Token")] 17 [HttpPost] 18 public object Token() 19 { 20 var response = new ResponseModel 21 { 22 StatusCode = 500, 23 Message = "很抱歉,系統出錯了", 24 }; 25 FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(0, "token示例", DateTime.Now, 26 DateTime.Now.AddHours(1), true, "token示例", 27 FormsAuthentication.FormsCookiePath); 28 if (ticket != null) 29 { 30 var token = FormsAuthentication.Encrypt(ticket); 31 response.StatusCode = 200; 32 response.Message = "獲取成功"; 33 response.Data = new { Secret = token }; 34 } 35 return Json(response); 36 } 37 #endregion 38 39 #region 參數聲明示例·正確寫法 40 [Route("Example")] 41 [HttpPost] 42 public object Example(FormDataCollection data) 43 { 44 var response = new ResponseModel 45 { 46 StatusCode = 200, 47 Message = "接收數據成功!", 48 Data = data.Get("Name") 49 }; 50 return Json(response); 51 } 52 #endregion 53 } 54 }