ASP.Net Core Web API结合Entity Framework Core框架(API的创建使用,接口前端权限设置,前端获取API的Get,post方法)(程序包引用以及导入数据库)

这篇具有很好参考价值的文章主要介绍了ASP.Net Core Web API结合Entity Framework Core框架(API的创建使用,接口前端权限设置,前端获取API的Get,post方法)(程序包引用以及导入数据库)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. Web Api 程序包引用

2. Web Api 的创建与Http类型的介绍

2.1 ASP.Net Core Web API项目的创建

2 .2  API接口的创建

2.3 HttpGet和HttpPost类型的区别

3.接口权限设置

4.HttpGet方法和HttpPOst方法

5.前端中用HttpGet/Poset获取接口数据

6.EF框架——配置数据库链接字符串(即将数据库中的表导入项目中)

7.Web Api和EF结合的增删改查需注意的部分代码

 8. 当web返回给窗体如下特殊字符串时,在web端的program 的main函数中加入以下代码:

1. Web Api 程序包引用

Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术。

EF Core 可用作对象关系映射程序 (O/RM),这可以实现以下两点:

  • 使 .NET 开发人员能够使用 .NET 对象处理数据库。
  • 无需再像通常那样编写大部分数据访问代码。

准备工作:

1.创建项目:打开Visual Studio2022,选择ASP.NET Core Web应用空项目基于.Net6 创建
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 的创建与Http类型的介绍

2.1 ASP.Net Core Web API项目的创建

1.通过vs建立一个ASP.Net Core Web API项目;(如果没有在搜索模板中找到它,就将模板栏滑动到最后,点击蓝色字体安装多个工具和功能),然后选中如图2所示2,再安装。

.net core webapi框架,.net core,c#.net core webapi框架,.net core,c#

2 .2  API接口的创建

生成项目后,解决方案会自动生成 Controllers 文件夹,里面存放的就是接口;

创建:

需要注意得是:命名方法一般为 名字+后缀 Controller;(不影响接口的名字,还是前部分样式) 最大字体为接口名称

.net core webapi框架,.net core,c#.net core webapi框架,.net core,c#

创建方式:

1.创建 API控制器

        点击文件夹右键添加 控制器 选则 通用API Api控制器,之后生成如下二代码,此时的接口还是不能用的;

.net core webapi框架,.net core,c#.net core webapi框架,.net core,c#

2.需要声明接口 [ApiController]  和一级接口路径[Route("Test")]

        (声明接口是必须的,声明接口路径最好还是带上--可以起个和接口名一样的路径好用);

3.正式定义接口和接口类型;

        在这里直介绍[HttpGet("getUsers")]和[HttpPost("getUsers")]两种接口类型 格式:接口类型+方法

注意:接口类型()中填写的是二级路径(自定义),效果如上白蓝色图 蓝色GET 是类型,Test一级路径 getUser就是二级路径即接口类型中的路径  ;

完整代码:

 [ApiController] //声明是一个API接口
    [Route("Test")] //路由:api接口的路径
    public class TestController : Controller
    {
        /// <summary>
        /// 获取所有人员数据
        /// </summary>
        /// <returns></returns>
        [HttpGet("getUsers")]
        public List<User> GetUsers()
        {
            List<User> list = UserManager.CreateUsers();
            return list;
        }
    }

2.3 HttpGet和HttpPost类型的区别

1.传入参数不同

HttpGet:传入个体基本类型 如:(int,string 可传多个);

HttpPost:传入的是主题参数,当然也可以传入个体参数;

  [HttpGet("getUserById")]
        public User GetUserById(int id)
        {
            return UserManager.GetUserById(id);
        }

//User 是一个内容
  [HttpPost("add")]
        public User Add(User user)
        {
            //List<User> users = new List<User>();
            return UserManager.Add(user);
        }

2.HttpGet接口执行后 返回的 Request URL路径可以在通过浏览器打开,如下图:

执行的就是get 网址,和执行效果图 图一相对应

.net core webapi框架,.net core,c#

 

运行效果图

.net core webapi框架,.net core,c#.net core webapi框架,.net core,c#

 执行效果图

.net core webapi框架,.net core,c#.net core webapi框架,.net core,c#

 

 

3.接口权限设置

1.创建一个类,并继承 ActionFilterAttribute

2.重写方法:OnActionExecuting  和 OnActionExecuted 方法

public class Intercept : ActionFilterAttribute
    {
        //在请求接口之前
         public override void OnActionExecuting(ActionExecutingContext context)
        {

        }
        //在请求接口之后
         public override void OnActionExecuted(ActionExecutedContext context)
        {
           
        }
    }

3.在OnActionExecuting  方法中设置权限和Token

注:接口权限只有后半部分,通过id,和路径判断权限表中是否有对应的数据(看个人习惯,可以将存入表中数据当为赋予权限,当返回不为空就是有权限;也可以认为存入表中的数据是禁止权限,这样返回不为空,说明没有权限)

 public override void OnActionExecuting(ActionExecutingContext context)
        {
            Debug.Write("拦截之前");
            //获取请求路径
            string path = context.HttpContext.Request.Path;
            Debug.Write("请求路径:" + path);

            //当登录是请求路径的时候不用拦截
            if (path != "/baseuser/login")
            {
                //----------------------------登录Token拦截-------------------------
                //此时获取前端参数,没有用到前端,单纯的接口,用此方法获取token值
                //object? tokenObj = context.ActionArguments["token"];
                //前端用到get,Post方法,用从头部获取  Taken  数据
                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)
                    {
                        //直接返回一个结果,修改请求的返回值,请求接口的方法不能执行,拦截之后的方法也不能执行
                        context.Result = new JsonResult(WebApiResponse.Create(2, "请重新登录"));
                        return;
                    }
                    //查询人员信息
                    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.缓存的权限集合  存放权限,所以需要有权限数据类,即权限包含了什么
        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}";//数据肯定是唯一的
            //判断是否符合权限信息
            FilterData data = filterDatas.FirstOrDefault(x => x.UserIdAndApiPath == str);
            if (data != null)
            {
                return data;
            }
            //如果没有则需要产生,且存入缓存集合
            WebApiContext context = null;
            try
            {
                context = new WebApiContext();
                //从数据库中查照符合的
                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($"查询数据失败:{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">参数</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=张三
            //参数+路径:http://127.0.0.1:5000?id=1&name=张三

            string pathAndParam = path;
            if (!string.IsNullOrEmpty(param))
            {
                pathAndParam += "?" + param;
            }
            //创建一个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(); //读取接口返回的数据
            //释放对象
            response.Close();
            sr.Close();
            stream.Close();
            return json;
        }
        /// <summary>
        /// post请求方法
        /// </summary>
        /// <param name="path">请求路径</param>
        /// <param name="param">参数</param>
        /// <param name="body">主题内容</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;
            }
            //创建一个HttpWebRequest对象,用来请求后台
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(pathAndParam);
            request.Method = "POST";
            request.Timeout = timeout;
            request.ContentType = "application/json;UTF-8"; //设置类型; //设置类型
            request.Headers.Add("token", Token); //请求头
            //把主体内容添加到请求数据中
            if (!string.IsNullOrEmpty(body))
            {
                byte[] buffer = Encoding.UTF8.GetBytes(body);
                request.ContentLength = buffer.Length; //主体内容的字节长度
                Stream requestStream = request.GetRequestStream(); //存放请求的数据
                requestStream.Write(buffer, 0, buffer.Length); //把主体内容写到流中
            }
            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获取接口数据

   //接口地址
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}");

注意:对应的参数在4中有说明,方法中对应的地址形式实际是下图中对应的地址,要仔细了解方法中是如何形成接口对应的地址的

.net core webapi框架,.net core,c#

6.EF框架——配置数据库链接字符串(即将数据库中的表导入项目中)

 视图 ——其他窗口——程序包管理器控制台   输入以下指令,将数据库中的表导入程序中

Scaffold-DbContext -Force "Server=192.168.218.26;Database=zy04_db4;uid=zy04;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context WebApiContext
  • server:数据库所在的主机ip地址
  • DataBase:数据库名称
  • uid:用户名
  • PassWorf:密码
  • Models:存放自动创建的实体类的文件夹(可以自己命名)
  • WebApiContext:直接操作数据库的类名(可以自己命名)
  • 有了WebApiContext类之后,不用再写连接数据库的逻辑了,只需要实例对应的数据表就可以操作如:
  • 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函数中加入以下代码:

.net core webapi框架,.net core,c#

 亲测有用:文章来源地址https://www.toymoban.com/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的创建使用,接口前端权限设置,前端获取API的Get,post方法)(程序包引用以及导入数据库)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ASP.NET Core Web API之Token验证

    在实际开发中,我们经常需要对外提供接口以便客户获取数据,由于数据属于私密信息,并不能随意供其他人访问,所以就需要验证客户身份。那么如何才能验证客户的什么呢?今天以一个简单的小例子,简述ASP.NET Core Web API开发过程中,常用的一种JWT身份验证方式。仅供学

    2024年02月11日
    浏览(25)
  • ASP.NET Core Web API 流式返回,逐字显示

    Websocket、SSE(Server-Sent Events)和长轮询(Long Polling)都是用于网页和服务端通信的技术。 Websocket是一种全双工通信协议,能够实现客户端和服务端之间的实时通信。它基于TCP协议,并且允许服务器主动向客户端推送数据,同时也允许客户端向服务器发送数据。 SSE是一种单向

    2023年04月23日
    浏览(29)
  • ASP.NET Core Web API入门之三:使用EF Core

    一般来讲我们做项目都会用实体类跟数据库实体进行关系对应,这样的好处方便我们维护、增删改查,并且可以减少SQL的编写,从而统一风格,那么 Entity Framework Core 就是很不错的ORM框架。 1、跨数据库支持能力强大,只需修改配置就可以轻松实现数据库切换。 2、提升了开发效

    2024年02月10日
    浏览(28)
  • 2.1 .net 8 ASP.NET Core Web API - Controller详解

    书接上回,上节我们留了几个问题,即: 1、接口Hello的名字究竟怎么来的? 2、我们如果想把接口改成其他的名称,应该怎么做? 3、我们继承ControllerBase,以及[Route(“[controller]”)]属性,又是分别起到什么作用? 需要解决以上几个问题,我们就要继续深入研究Controller相关的

    2024年02月20日
    浏览(27)
  • ASP.NET Core 中基于 Controller 的 Web API

    客户端发送Http请求,Contoller响应请求,并从数据库读取数据,序列化数据,然后通过 Http Response返回序列化的数据。 Web API 的所有controllers 一般继承于 ControllerBase 类,而不是Controller 类。 因为 Controller 类也继承自ControllerBase 类,但是支持views,而API一般不需要这个功能。 Co

    2024年02月10日
    浏览(33)
  • ASP.NET中使用Entity Framework(EF)关联表查询

    在ASP.NET中使用Entity Framework(EF)进行关联表查询的具体步骤如下: 配置数据库上下文(DbContext):在 DbContext 派生类中,使用 DbSetT 属性表示每个实体对应的数据库表。确保每个实体类和关系都正确映射到数据库表。 定义关联表之间的导航属性:在实体类中,使用导航属性表

    2024年02月14日
    浏览(24)
  • 【c#,.NET】Entity Framework Core基础详解

    目录   一、EF Core概述 1.1 什么是ORM?  1.2 EF Core的性能怎么样  二、EF Core入门 2.1 什么是Migration数据库迁移: 2.2  EF Core数据的增删改查 2.2.1 增加数据 2.2.2 查询数据  2.2.3 修改和删除数据 三、EF Core的实体类配置 3.1 约定大于配置 3.2 EF Core两种配置方式 3.2.1 Data Annotation 3.2.2 

    2024年02月04日
    浏览(27)
  • 在 ASP.NET Core Web API 中处理 Patch 请求

    PUT 和 PATCH 方法用于更新现有资源。 它们之间的区别是,PUT 会替换整个资源,而 PATCH 仅指定更改。 在 ASP.NET Core Web API 中,由于 C# 是一种静态语言( dynamic 在此不表),当我们定义了一个类型用于接收 HTTP Patch 请求参数的时候,在 Action 中无法直接从实例中得知客户端提供了哪

    2024年02月04日
    浏览(24)
  • 【服务器】ASP.Net Core(C#)创建Web站点

    简单几步实现本地ASP.Net.Core web 站点结合cpolar内网穿透工具实现远程访问 1. 创建站点 *环境搭建,这边测试,使用.NET 6.0 SDK,可以点击跳转到官网下载,下载后安装即可. 安装完成后,进入到某个文件夹,打开powershell执行下面命令,创建新的 Web 应用,名称叫:aspnetcoreapp 2. 运行站点 信任开

    2024年02月11日
    浏览(28)
  • ASP.NET Core Web API 流式返回,实现ChatGPT逐字显示

    🏆作者:科技、互联网行业优质创作者 🏆专注领域:.Net技术、软件架构、人工智能、数字化转型、DeveloperSharp、微服务、工业互联网、智能制造 🏆欢迎关注我(Net数字智慧化基地),里面有很多 高价值 技术文章, 是你刻苦努力也积累不到的经验 ,能助你快速成长。升职

    2024年02月22日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包