目錄
1. Web Api 程序包引用
2. Web Api 的創(chuàng)建與Http類型的介紹
2.1?ASP.Net Core Web API項目的創(chuàng)建
2?.2? API接口的創(chuàng)建
2.3?HttpGet和HttpPost類型的區(qū)別
3.接口權限設置
4.HttpGet方法和HttpPOst方法
5.前端中用HttpGet/Poset獲取接口數(shù)據(jù)
6.EF框架——配置數(shù)據(jù)庫鏈接字符串(即將數(shù)據(jù)庫中的表導入項目中)
7.Web Api和EF結合的增刪改查需注意的部分代碼
?8. 當web返回給窗體如下特殊字符串時,在web端的program 的main函數(shù)中加入以下代碼:
1. Web Api 程序包引用
Entity Framework (EF) Core 是輕量化、可擴展、開源和跨平臺版的常用 Entity Framework 數(shù)據(jù)訪問技術。
EF Core 可用作對象關系映射程序 (O/RM),這可以實現(xiàn)以下兩點:
- 使 .NET 開發(fā)人員能夠使用 .NET 對象處理數(shù)據(jù)庫。
- 無需再像通常那樣編寫大部分數(shù)據(jù)訪問代碼。
準備工作:
1.創(chuàng)建項目:打開Visual Studio2022,選擇ASP.NET Core Web應用空項目基于.Net6 創(chuàng)建
2.安裝Nuet程序包——項目——依賴項——管理NuGet程序包(版本等級盡量一樣)Microsoft.EntityFrameworkCore.SqlServer (適用于EF Core SQL Server 提供程序)
Microsoft.EntityFrameworkCore.Design(適用于EF Core .NET Core CLI 工具 )
Microsoft.EntityFrameworkCore.Tools(適用于 EF Core 的包管理器控制臺工具)Microsoft.EntityFrameworkCore.Design
2. Web Api 的創(chuàng)建與Http類型的介紹
2.1?ASP.Net Core Web API項目的創(chuàng)建
1.通過vs建立一個ASP.Net Core Web API項目;(如果沒有在搜索模板中找到它,就將模板欄滑動到最后,點擊藍色字體安裝多個工具和功能),然后選中如圖2所示2,再安裝。
2?.2? API接口的創(chuàng)建
生成項目后,解決方案會自動生成 Controllers 文件夾,里面存放的就是接口;
創(chuàng)建:
需要注意得是:命名方法一般為 名字+后綴 Controller;(不影響接口的名字,還是前部分樣式) 最大字體為接口名稱
創(chuàng)建方式:
1.創(chuàng)建 API控制器
????????點擊文件夾右鍵添加 控制器 選則 通用API Api控制器,之后生成如下二代碼,此時的接口還是不能用的;
2.需要聲明接口?[ApiController]? 和一級接口路徑[Route("Test")]
????????(聲明接口是必須的,聲明接口路徑最好還是帶上--可以起個和接口名一樣的路徑好用);
3.正式定義接口和接口類型;
????????在這里直介紹[HttpGet("getUsers")]和[HttpPost("getUsers")]兩種接口類型 格式:接口類型+方法
注意:接口類型()中填寫的是二級路徑(自定義),效果如上白藍色圖 藍色GET 是類型,Test一級路徑?getUser就是二級路徑即接口類型中的路徑? ;
完整代碼:
[ApiController] //聲明是一個API接口 [Route("Test")] //路由:api接口的路徑 public class TestController : Controller { /// <summary> /// 獲取所有人員數(shù)據(jù) /// </summary> /// <returns></returns> [HttpGet("getUsers")] public List<User> GetUsers() { List<User> list = UserManager.CreateUsers(); return list; } }
2.3?HttpGet和HttpPost類型的區(qū)別
1.傳入?yún)?shù)不同
HttpGet:傳入個體基本類型 如:(int,string 可傳多個);
HttpPost:傳入的是主題參數(shù),當然也可以傳入個體參數(shù);
[HttpGet("getUserById")] public User GetUserById(int id) { return UserManager.GetUserById(id); } //User 是一個內(nèi)容 [HttpPost("add")] public User Add(User user) { //List<User> users = new List<User>(); return UserManager.Add(user); }
2.HttpGet接口執(zhí)行后 返回的 Request URL路徑可以在通過瀏覽器打開,如下圖:
執(zhí)行的就是get 網(wǎng)址,和執(zhí)行效果圖 圖一相對應
?
運行效果圖
?執(zhí)行效果圖
?
?
3.接口權限設置
1.創(chuàng)建一個類,并繼承?ActionFilterAttribute
2.重寫方法:OnActionExecuting? 和?OnActionExecuted 方法
public class Intercept : ActionFilterAttribute { //在請求接口之前 public override void OnActionExecuting(ActionExecutingContext context) { } //在請求接口之后 public override void OnActionExecuted(ActionExecutedContext context) { } }
3.在OnActionExecuting? 方法中設置權限和Token
注:接口權限只有后半部分,通過id,和路徑判斷權限表中是否有對應的數(shù)據(jù)(看個人習慣,可以將存入表中數(shù)據(jù)當為賦予權限,當返回不為空就是有權限;也可以認為存入表中的數(shù)據(jù)是禁止權限,這樣返回不為空,說明沒有權限)
public override void OnActionExecuting(ActionExecutingContext context) { Debug.Write("攔截之前"); //獲取請求路徑 string path = context.HttpContext.Request.Path; Debug.Write("請求路徑:" + path); //當?shù)卿浭钦埱舐窂降臅r候不用攔截 if (path != "/baseuser/login") { //----------------------------登錄Token攔截------------------------- //此時獲取前端參數(shù),沒有用到前端,單純的接口,用此方法獲取token值 //object? tokenObj = context.ActionArguments["token"]; //前端用到get,Post方法,用從頭部獲取 Taken 數(shù)據(jù) object? tokenObj = context.HttpContext.Request.Headers["token"]; if (tokenObj == null || string.IsNullOrEmpty(tokenObj.ToString())) { context.Result = new JsonResult(WebApiResponse.Create(1, "非法登錄")); } else { //登陸時返回token返回值 string token = tokenObj.ToString(); //通過token 返回對應的 人員id ,登陸的時候會返回一個Token值,將人員id和Token存儲到鍵值對中, //此時通過GetIdByToken方法判斷鍵值對中是否有對應的值 int userId = UserData.GetIdByToken(token); if (userId == -1) { //直接返回一個結果,修改請求的返回值,請求接口的方法不能執(zhí)行,攔截之后的方法也不能執(zhí)行 context.Result = new JsonResult(WebApiResponse.Create(2, "請重新登錄")); return; } //查詢?nèi)藛T信息 BaseUser user = UserData.GetDataById(userId); if (user == null) { context.Result = new JsonResult(WebApiResponse.Create(3, "用戶不存在")); return; } //---------------------------------接口權限攔截----------------------------------- FilterData data = UserFilterData.GetFilteData_ByApiPath(userId, path); if (data != null) { context.Result = new JsonResult(WebApiResponse.Create(4, "用戶沒有權限")); return; } } } }
4.上述設置中用到的封裝方法?GetIdByToken(),GetFilteData_ByApiPath()
//寫在登錄接口中,將token和id存入 UserData.AddToken(token, data.Id); //---------------------有關token的方法--------------------- /// <summary> // 存放所有登錄的Token值,鍵:token值, 值:人員id public static readonly Dictionary<string, int> Tokens = new Dictionary<string, int>(); // 添加一個Taken 值 public static void AddToken(string token, int id) { Tokens[token] = id; } public static int GetIdByToken(string token) { //通過taken尋找對應的 id 人員 if (Tokens.ContainsKey(token)) { return Tokens[token]; } else { return -1; } } //----------------------通過獲取的接口地址查詢權限表,看返回結果是否為空----------- //1.緩存的權限集合 存放權限,所以需要有權限數(shù)據(jù)類,即權限包含了什么 public static List<FilterData> filterDatas = new List<FilterData>(); /// <summary> /// 3. 通過id或者接口路徑來 獲取權限 /// </summary> /// <param name="userid">用戶id</param> /// <param name="apipath">接口地址</param> /// <returns></returns> public static FilterData GetFilteData_ByApiPath(int userid, string apipath) { string str = $"{userid}_{apipath}";//數(shù)據(jù)肯定是唯一的 //判斷是否符合權限信息 FilterData data = filterDatas.FirstOrDefault(x => x.UserIdAndApiPath == str); if (data != null) { return data; } //如果沒有則需要產(chǎn)生,且存入緩存集合 WebApiContext context = null; try { context = new WebApiContext(); //從數(shù)據(jù)庫中查照符合的 BaseRoot? baseRoot = context.BaseRoots.FirstOrDefault(x => x.UserId == userid && x.ApiPath == apipath); if (baseRoot == null) { return null; } //存在就存入緩存集合中 data = new FilterData(); data.Id = baseRoot.Id; data.UserId = baseRoot.UserId; data.ApiPath = baseRoot.ApiPath; data.FilterName = baseRoot.RootName; filterDatas.Add(data); return data; } catch (Exception ex) { Debug.WriteLine($"查詢數(shù)據(jù)失?。簕ex.Message}"); return null; } finally { context?.Dispose(); } } public class FilterData { public int Id { get; set; } //id public int UserId { get; set; }//人員id public string ApiPath { get; set; }//操作接口路徑 public string? FilterName { get; set; }//權限名稱 public string UserIdAndApiPath { get => $"{UserId}_{ApiPath}"; } }
4.HttpGet方法和HttpPOst方法
public class ApiHttp { private static string Token { get; set; } = "123456"; /// <summary> /// get請求方法 /// </summary> /// <param name="path">地址</param> /// <param name="param">參數(shù)</param> /// <param name="timeout">請求超時時間,以毫秒為單位</param> /// <returns></returns> public static string ApiGet(string path,string param,int timeout) { //path:http://127.0.0.1:5000 //param:id=1&name=張三 //參數(shù)+路徑:http://127.0.0.1:5000?id=1&name=張三 string pathAndParam = path; if (!string.IsNullOrEmpty(param)) { pathAndParam += "?" + param; } //創(chuàng)建一個HttpWebRequest對象,用來請求后臺 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(pathAndParam); request.Method = "GET"; //請求方式:GET,POST,PUT, DELETE request.Timeout = timeout; //請求超時時間 request.ContentType = "application/json;UTF-8"; //設置類型5 request.Headers.Add("token", Token); //請求頭 WebResponse response = request.GetResponse(); //相當于后臺返回的對象 Stream stream = response.GetResponseStream(); //response流 StreamReader sr = new StreamReader(stream, Encoding.UTF8); string json = sr.ReadToEnd(); //讀取接口返回的數(shù)據(jù) //釋放對象 response.Close(); sr.Close(); stream.Close(); return json; } /// <summary> /// post請求方法 /// </summary> /// <param name="path">請求路徑</param> /// <param name="param">參數(shù)</param> /// <param name="body">主題內(nèi)容</param> /// <param name="timeout">請求超時時間,以毫秒位單位</param> /// <returns></returns> public static string ApiPost(string path, string param, string body, int timeout = 5000) { string pathAndParam = path; if (!string.IsNullOrEmpty(param)) { pathAndParam += "?" + param; } //創(chuàng)建一個HttpWebRequest對象,用來請求后臺 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(pathAndParam); request.Method = "POST"; request.Timeout = timeout; request.ContentType = "application/json;UTF-8"; //設置類型; //設置類型 request.Headers.Add("token", Token); //請求頭 //把主體內(nèi)容添加到請求數(shù)據(jù)中 if (!string.IsNullOrEmpty(body)) { byte[] buffer = Encoding.UTF8.GetBytes(body); request.ContentLength = buffer.Length; //主體內(nèi)容的字節(jié)長度 Stream requestStream = request.GetRequestStream(); //存放請求的數(shù)據(jù) requestStream.Write(buffer, 0, buffer.Length); //把主體內(nèi)容寫到流中 } WebResponse response = request.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader sr = new StreamReader(responseStream, Encoding.UTF8); string json = sr.ReadToEnd(); return json; } public class JsonData<T> { public int Code { get; set; } public string Message { get; set; } //public List<Dictionary<string, object>> Data { get; set; } //public List<BaseUser> Data { get; set; } public T Data { get; set; } } } }
5.前端中用HttpGet/Poset獲取接口數(shù)據(jù)
//接口地址 string HttpPath { get; set; } = "http://127.0.0.1:5000";//和圖中沒有對應,需要自己注意 //get string json = Http.ApiHttp.ApiGet($"{HttpPath}/TAH/TAH", null, 50000); //Post string json = ApiPost($"{HttpPath}/baseuser/updata", null, $"{body}");
注意:對應的參數(shù)在4中有說明,方法中對應的地址形式實際是下圖中對應的地址,要仔細了解方法中是如何形成接口對應的地址的
6.EF框架——配置數(shù)據(jù)庫鏈接字符串(即將數(shù)據(jù)庫中的表導入項目中)
?視圖 ——其他窗口——程序包管理器控制臺? ?輸入以下指令,將數(shù)據(jù)庫中的表導入程序中
Scaffold-DbContext -Force "Server=192.168.218.26;Database=zy04_db4;uid=zy04;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context WebApiContext
- server:數(shù)據(jù)庫所在的主機ip地址
- DataBase:數(shù)據(jù)庫名稱
- uid:用戶名
- PassWorf:密碼
- Models:存放自動創(chuàng)建的實體類的文件夾(可以自己命名)
- WebApiContext:直接操作數(shù)據(jù)庫的類名(可以自己命名)
- 有了WebApiContext類之后,不用再寫連接數(shù)據(jù)庫的邏輯了,只需要實例對應的數(shù)據(jù)表就可以操作如:
WebApiContext con=new WebAiContext(); List<BaseUser> list=con.BaseUsers.ToList();//查詢所有
7.Web Api和EF結合的增刪改查需注意的部分代碼
1.通過***查找:FirstOrDefault
WebApiContext context = null; context = new WebApiContext(); BaseUser user = context.BaseUsers.FirstOrDefault(x => x.Id == id);
2.增刪改之后,需要保存
context.BaseRoles.Update(role); context.BaseRoles.Add(role); context.BaseRoles.Remove(role); context.SaveChanges();
?8. 當web返回給窗體如下特殊字符串時,在web端的program 的main函數(shù)中加入以下代碼:
?文章來源:http://www.zghlxwxcb.cn/news/detail-717720.html
?親測有用:文章來源地址http://www.zghlxwxcb.cn/news/detail-717720.html
builder.Services.AddControllersWithViews().AddJsonOptions(options => { options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All); });
到了這里,關于ASP.Net Core Web API結合Entity Framework Core框架(API的創(chuàng)建使用,接口前端權限設置,前端獲取API的Get,post方法)(程序包引用以及導入數(shù)據(jù)庫)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!