一.准备工作1.1的源配置。Visual Studio NuGet包源地址:
http://47 . 102 . 150 . 59:8087/nuget/一些辅助功能包可以提高开发效率。2.创建项目选择项目类型和自定义项目名
源地址:
http://47 . 102 . 150 . 59:8087/nuget/
一些辅助功能包可以提高开发效率。
2.创建项目
选择项目类型和自定义项目名称。
3.基本配置
应用端口配置、IOC容器配置、日志配置、数据库配置、映射映射配置…
//Program.cs public static void Main(string[] args) { var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) // 添加端口配置文件 .AddJsonFile("hosting.json", true) .Build(); var host = Host.CreateDefaultBuilder(args) // 添加Autofac作为IOC容器 .UseServiceProviderFactory(AppServiceProvider.Instance().AutofacServiceProviderFactory) .ConfigureWebHostDefaults(webHostBuilder => { webHostBuilder .UseContentRoot(Directory.GetCurrentDirectory()) .UseConfiguration(config) .UseStartup<Startup>(); }) .Build(); host.Run(); } //Startup.cs public void ConfigureServices(IServiceCollection services) { MapperHelper.CreateMap();//Map映射配置 services.UseNCoreAspNet<NCoreAspNetOptions>(options => { //日志配置 options.Log4netConfig = "log4net.config"; options.UseUpload = true; options.UseAnyCors = true; options.ApiSecurityFilter = false; //数据库配置 options.DefaultDBOptions = new DefaultDBOptions { DBSectionName = "DBConnectionSetting", DefaultConnectionName = "defaultConnection" }; }); }
二、API实现1.创建数据模型(视图模型)数据属性(名称、类型、约束等。)接口定义需要)【所有属性命名规则都是小写,方便前端JS调用,无需检查属性的大小写】
/// <summary> ///用户基本信息 /// </summary> public class UserViewMmodel { /// <summary> /// 用户名 /// </summary> public string user_name { get; set; } = "hanbing"; /// <summary> /// 昵称 /// </summary> public string nickname { get; set; } = "老卢聊技术"; /// <summary> /// qq号码 /// </summary> public string qq { get; set; } = "81868164"; /// <summary> ///微信号码 /// </summary> public string wxid { get; set; } = "hanbing_81868164"; /// <summary> /// 地址 /// </summary> public string address { get; set; } /// <summary> /// 年龄 /// </summary> public int age { get; set; } /// <summary> /// 创建时间 /// </summary> public DateTime creation_time { get; set; } /// <summary> /// 版本信息 /// </summary> public string version { get; set; } }
2.创建一个控制器并编写逻辑代码。1).设置接口输出数据格式(JSON或XML)
[Produces("application/json")]//Controller中方法默认输出json格式数据 //[Produces("application/xml")]//Controller中方法默认输出xml格式数据 public class TestApiController : Controller
2)设置接口路由(定义接口版本[便于区分后版本和新版本])
[Route("api/v1/testapi")]//固定路由配置 //[Route("api/v1/[controller]")]//固定部分路由配置 public class TestApiController : Controller
3).设置接口请求方法,常见的如下:
GET:从服务器获取资源(一个或多个项目)。
POST:在服务器中创建新资源。
PUT:更新服务器中的资源(客户端提供更改后的完整资源)
补丁:更新服务器中的资源(客户端提供已更改的属性)
删除:从服务器中删除资源。
/// <summary> /// 返回用户信息接口 /// </summary> /// <returns></returns> [HttpGet]//请求方法为GET [Route("getuser")]//自定义路由 //[Produces("application/xml")]//输出xml格式 public Task<UserViewMmodel> Index() {}
4).返回JSON数据格式接口
/// <summary> /// 返回用户信息接口 /// </summary> /// <returns></returns> [HttpGet]//请求方法为GET [Route("getuser")]//自定义路由 //[Produces("application/xml")]//输出xml格式 public Task<UserViewMmodel> Index() { return Task.Run(() => { UserViewMmodel res = null; //业务逻辑代码.... res = new UserViewMmodel { address = "上海市浦东区世纪大道200号", age = 23, creation_time = DateTime.Now, version = "v1.0" }; return res; }); }
5).返回文件(输出文件)接口
/// <summary> /// 输出文件接口 /// </summary> /// <returns></returns> [HttpGet]//请求方法为GET [Route("getfile")]//自定义路由 public FileResult Download() { var fileData = $"{Directory.GetCurrentDirectory()}/wwwroot/css/site.css"; var actionresult = new FileStreamResult(fileData.GetFileData().ToStream(), "text/css"); actionresult.FileDownloadName = "site.css"; return actionresult; }
6).剪辑图片界面
/// <summary> /// 裁剪图片接口 /// </summary> /// <param name="width"></param> /// <param name="name"></param> /// <returns></returns> [HttpGet]//请求方法为GET [Route("getimage/{width}/{name}")]//自定义路由 public IActionResult GetImage(int width, string name) { var imgPath = $@"{Directory.GetCurrentDirectory()}/wwwroot/imgs/{name}"; //缩小图片 using (var imgBmp = new Bitmap(imgPath)) { //找到新尺寸 var oWidth = imgBmp.Width; var oHeight = imgBmp.Height; var height = oHeight; if (width > oWidth) { width = oWidth; } else { height = width * oHeight / oWidth; } var newImg = new Bitmap(imgBmp, width, height); newImg.SetResolution(72, 72); byte[] bytes; using (var ms = new MemoryStream()) { newImg.Save(ms, ImageFormat.Bmp); bytes = ms.GetBuffer(); } return new FileContentResult(bytes, "image/jpeg"); } }
7).上传单个文件界面
/// <summary> /// 上传文件,需要指定name值为fromFile,如:form-data; name="fromFile"; filename="8.png" /// </summary> /// <param name="fromFile"></param> /// <returns></returns> [Route("upfile")]//自定义路由 [HttpPost]//请求方法为POST [AllowAnonymous] public UpFileViewModel UplodeFile([FromForm] IFormFile fromFile) { if (fromFile != null) { using (var sm = fromFile.OpenReadStream()) { string savePath = $"{Directory.GetCurrentDirectory()}/wwwroot/temp/{Id.LongId()}{fromFile.FileName.GetExtension()}"; sm.Save(savePath); } return new UpFileViewModel { code = 0, msg = "保存成功" }; } return new UpFileViewModel { code = 1, msg = "保存失败" }; }
8).上传多个文件接口
/// <summary> /// 上传多个文件,需要指定name值为files,如:form-data; name="files"; filename="8.png" /// </summary> /// <param name="fromFile"></param> /// <returns></returns> [Route("upfiles")]//自定义路由 [HttpPost]//请求方法为POST [AllowAnonymous] public UpFileViewModel UplodeFiles([FromForm] IFormFileCollection files) { if (files != null) { files.ForEach(fromFile => { using (var sm = fromFile.OpenReadStream()) { string savePath = $"{Directory.GetCurrentDirectory()}/wwwroot/temp/{Id.LongId()}{fromFile.FileName.GetExtension()}"; sm.Save(savePath); } }); return new UpFileViewModel { code = 0, msg = "保存成功" }; } return new UpFileViewModel { code = 1, msg = "保存失败" }; }
9).上传多文件界面。上传时不需要指定name参数。
/// <summary> /// 上传时不需要指定name参数:form-data; name=""; filename="222222222222.jpg" /// </summary> /// <returns></returns> [Route("upfiles2")]//自定义路由 [HttpPost]//请求方法为POST [AllowAnonymous] public UpFileViewModel UplodeFiles2() { var files = this.Request.Form?.Files; if (files != null) { files.ForEach(fromFile => { using (var sm = fromFile.OpenReadStream()) { string savePath = $"{Directory.GetCurrentDirectory()}/wwwroot/temp/{Id.LongId()}{fromFile.FileName.GetExtension()}"; sm.Save(savePath); } }); return new UpFileViewModel { code = 0, msg = "保存成功" }; } return new UpFileViewModel { code = 1, msg = "保存失败" }; }
4).未完待续…
3.测试接口调用。4.增加日志功能。5.将接口程序发布到服务器(windows和linux)