教程前言

本教程从构建项目开始到实战采用的是vsCode开发工具,初学者建议使用vs Studio进行创建,因为这样建的东西比较全一点。

安装net core 环境

1.我们首先要下载net core sdk ,这样我们才能使用dotnet终端命令和运行项目,官方下载链接:net core sdk 下载,我下载的版本是6.0。
下载安装完成之后打开cmd窗口验证是否安装成功:

dotnet --version

效果如图:
在这里插入图片描述
查看dotnet其它命令

dotnet --help

2.安装c#运行环境
在vscode插件中搜索c#,并进行安装。
在这里插入图片描述

构建wepApi项目

在vsCode中我们使用终端命令快速构建webApi项目:

#创建webApi项目
dotnet new webapi -o TodoApi
#进入项目目录
cd TodoApi
#安装sqlserver数据库包
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
#安装内存数据库包
dotnet add package Microsoft.EntityFrameworkCore.InMemory
code -r ../TodoApi

执行完后目录结构,有一些是我后面添加的
在这里插入图片描述

program.cs :服务注册类文件,像数据库服务注册,拦截器注册等都在里面;
appsettings.json :配置类文件,通常放置一些可配置的信息,这样就不用去改代码,像数据库连接字符串,访问接口地址等;

我们就可以使用dotnet命令运行项目了

dotnet run

运行之后在本地就可以在浏览器访问项目默认的接口https://localhost:5001/WeatherForecast
在这里插入图片描述
tip:这里默认访问形式是控制器的get方法,如果我们想访问 控制器/方法名,需要在控制器页面修改访问路由,这样就可以了。
在这里插入图片描述

操作数据库

  1. 创建Models文件夹,创建model类文件

在这里插入图片描述

  • 类型后面加?代表可以为null
  • 标注属性key,代表是主键,表中无主键需标注keyless
  1. 创建模型操作上下文类
using Microsoft.EntityFrameworkCore;
using System.Diagnostics.CodeAnalysis;

namespace TodoApi.Models
{
    public class TodoContext : DbContext
    {
        public TodoContext(DbContextOptions<TodoContext> options)
            : base(options)
        {
        }

        public DbSet<personApplyInfo> personApplyInfo { get; set; } = null!;
        public DbSet<phoneInfo> phoneInfo { get; set; } = null!;
    }
}
  1. 注册数据库服务
    在这里插入图片描述
  2. 编写操作数据库接口(可以使用帮助类或者ef)
    一、帮助类方式
using System.Data;
using System.Data.SqlClient;
  public class SqlHelper
    {
        //satic静态,一旦赋值,会一直保留这个值。不会被回收。
        public static string? Constr { get; set; }
        public static DataTable ExecuteTable(string cmdText) {
            using (SqlConnection con = new SqlConnection(Constr))
            {
                con.Open();
                // SqlCommand对象:Ado.Net中执行数据库命令的对象。
                SqlCommand cmd = new SqlCommand(cmdText, con);
                //1、表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接。
                //2、在SqlDataAdapter和DataSet之间没有直接连接。当完成SqlDataAdpater.Fill(DataSet)调用后,两个对象之间就没有连接了。
                SqlDataAdapter sda = new SqlDataAdapter(cmd);
                DataSet ds = new DataSet();
                sda.Fill(ds);

                return ds.Tables[0];
            }
        }
    }

在这里插入图片描述
二、EF
初始化操作对象
在这里插入图片描述
在这里插入图片描述
查询操作方法
在这里插入图片描述
新增操作方法
在这里插入图片描述
ef的写法大家可以百度,这里不做详解。
5.

接口调用

net core可以使用模型验证参数,我们创建验证模型类目录和文件
在这里插入图片描述
其中可以通过标注属性的方式进行验证,如果我们不需要的话可以进行在program.cs关闭。

builder.Services.Configure<ApiBehaviorOptions>((o) =>
{
    o.SuppressModelStateInvalidFilter = true;
});
  1. Get
    在这里插入图片描述
    我们访问就跟平时一样调用,url?parm=""
  2. Post
    需要注意参数是放在formbody中,且需要配置content-type:application/json;charset=UTF-8
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
##修改端口绑定
当我们发布时需要用ip+端口绑定
##读取配置文件

var sqlstr = builder.Configuration.GetSection("ConnectionStrings")["SqlServerConnection"];

配置文件内容
在这里插入图片描述

相关快速扩展

在这里插入图片描述
将地址改为http://:[端口],如http://:5245。

  1. 转换类
    使用的是Newtonsoft.Json包,没有请安装
    在这里插入图片描述

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
/// <summary>
/// JSON帮助类
/// </summary>
namespace Opertion
{


    public class Opertion : ControllerBase
    {

        /// <summary> 
        /// 数据表转键值对集合
        /// 把DataTable转成 List集合, 存每一行 
        /// 集合中放的是键值对字典,存每一列 
        /// </summary> 
        /// <param name="dt">数据表</param> 
        /// <returns>哈希表数组</returns> 
        public static List<Dictionary<string, object>> DataTableToList(DataTable dt)
        {
            List<Dictionary<string, object>> list
                 = new List<Dictionary<string, object>>();

            foreach (DataRow dr in dt.Rows)
            {
                Dictionary<string, object> dic = new Dictionary<string, object>();
                foreach (DataColumn dc in dt.Columns)
                {
                    dic.Add(dc.ColumnName, dr[dc.ColumnName]);
                }
                list.Add(dic);
            }
            return list;
        }

        /// <summary> 
        /// 数据集转键值对数组字典 
        /// </summary> 
        /// <param name="dataSet">数据集</param> 
        /// <returns>键值对数组字典</returns> 
        public static Dictionary<string, List<Dictionary<string, object>>> DataSetToDic(DataSet ds)
        {
            Dictionary<string, List<Dictionary<string, object>>> result = new Dictionary<string, List<Dictionary<string, object>>>();

            foreach (DataTable dt in ds.Tables)
                result.Add(dt.TableName, DataTableToList(dt));

            return result;
        }

        public static string FormatDateToJson<T>(T obj)
        {
            IsoDateTimeConverter timeFormat = new IsoDateTimeConverter();
            timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm";
            return JsonConvert.SerializeObject(obj, Formatting.Indented, timeFormat);
        }
        public static OkObjectResult ReturnDatToJson(Enum code, string msg, object data)
        {
            return new OkObjectResult(new
            {
                code = code,
                msg = msg,
                data = data
            });
        }
    }
}


  1. 使用枚举类
using System;
using System.Reflection;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

public enum errorEunm
{
    [Display(Name = "1小时内,连续超过5次申请验证,请于24小时后再申请")]
    waitLoing = 101,
    [Display(Name = "请填写手机号")]
    phoneReq = 102,
    [Display(Name = "请填写正确的手机号格式")]
    phoneFmort = 103,
    [Display(Name = "操作成功")]
    success = 200,
    [Display(Name = "操作失败")]
    Error = 400,
    [Display(Name = "请发送手机验证码")]
    phoneCode = 103,
    [Display(Name = "验证码不一致")]
    codeDiff = 104,
    [Display(Name = "请填写申请名称")]
    applyName = 105

    

}
public static class EumHelper
{
    /// <summary>
    /// 获得枚举的displayName
    /// </summary>
    /// <param name="eum"></param>
    /// <returns></returns>
    public static string GetDisplayName(this Enum eum)
    {
        var type = eum.GetType();//先获取这个枚举的类型
        var field = type.GetField(eum.ToString());//通过这个类型获取到值
        var obj = (DisplayAttribute)field.GetCustomAttribute(typeof(DisplayAttribute));//得到特性
        return obj.Name ?? "";
    }
}

在这里插入图片描述

  1. 拦截器
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc;
    public class MyExpextFilter : ExceptionFilterAttribute
    {
        private ILogger<MyExpextFilter> logger;
        public MyExpextFilter(ILogger<MyExpextFilter> logger)
        {
            this.logger = logger;
        }
        public override void OnException(ExceptionContext context)
        {
            if (!context.ExceptionHandled) //如果错误没有处理过
            {
                if (this.IsAjax(context.HttpContext.Request))
                {
                    context.Result = new OkObjectResult( new//
                    {
                        Message = context.Exception.Message,
                        ReturnCode = context.HttpContext.Response.StatusCode,
                        Data = new List<object>()
                    });
                }
                logger.LogError(context.Exception.Message);
                context.ExceptionHandled = true; //表示错误已经处理过
            }
        }
        public override Task OnExceptionAsync(ExceptionContext context)
        {
            this.OnException(context);
            return Task.CompletedTask;
        }
        //header中 x-requested-with  XMLHttpRequest  //表明是AJax异步
        private bool IsAjax(HttpRequest httpRequest)
        {
            string requestType = httpRequest.Headers["x-requested-with"];
            return "XMLHttpRequest".Equals(requestType, StringComparison.Ordinal);
        }
    }

总结

最近才开始学习netcore,此文章只是作为入门参考,还有很多东西还要继续学习,后面会发关于部署的相关文章,发现更好的也会进行更新。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐