最近就想着学学新东西,转换一下思维,便计划跟着微软官网来实践实践传神的ASP.net core 6.0
环境准备
我本机安装的是:
创建项目
文件->新建->项目,找到并选中ASP.NET Core Web API模板,然后点击下一步,弹出新建项目对话框,输入项目名,点击下一步,
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(1)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/26f0ccc0ca524277acf6df16c118c3a7.jpg)
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(2)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/bf3f27d78e3248bfa19979658a17f3b7.jpg)
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(3)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/6fe005f9aff64c6e83351f112860349d.jpg)
该界面建议选中[启用Docker],当然也可以不选,对于学习ASP.NET Core Web API没什么影响。其他选项默即可,如果要创建Mini API,则无需勾选[使用控制器],然后点击创建
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(4)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/37bac7b84f194a3fa46066cac44ade0d.jpg)
因为我选择了启动Docker,所以会提示安装Docker Desktop的对话框,这里我并不需要它,直接点击否即可。
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(5)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/e6ab576788c947c0b77414b5c65885ce.jpg)
项目创建成功后,我们可以在Program.cs类中看到,模板会默认启用Swagger
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(6)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/f79d0f62efaf4e5fb6a76611c09c7bdb.jpg)
另外,模板会自动创建一个WeatherForecastController.cs的示例类,在该类中我们可以看到该类继承于ControllerBase,并有ApiController和Route两个特性,
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(7)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/dadb82d25820412c8fa134d23781c6b6.jpg)
现在直接运行起来看看效果
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(8)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/91de4d47a1ac43939f15c721ee9e2695.jpg)
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(9)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/f8e527b092f543ed80a1cfe7c550c194.jpg)
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(10)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/e1277d48dcd147799f9033213806ba89.jpg)
运行起来后,会自动打开浏览器并跳转至swagger页面,这是项目生成时默认设置的,我们可以通过修改launchSettings.json来设置默认启动页面和端口
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(11)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/5c10c181e9b442b6a6a4e2c87e1339d1.jpg)
新建WEB API接口新建实体类
在项目目录中新建一个Models文件夹用于存放实体类,新建一个名为Order类
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(12)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/995ffbc69dc24cdd8b8d6bb50b8a513f.jpg)
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(13)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/cdf9c5cba6d84869bb40bc9e2e302ac6.jpg)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public class Order
{
public long Id { get; set; }
/// <summary>
/// 订单编号
/// </summary>
public string OrderNo { get; set; }
/// <summary>
/// 订单金额
/// </summary>
public decimal Amount { get; set; }
/// <summary>
/// 订单时间
/// </summary>
public DateTime CreateTime { get; set; }
}
|
创建数据库访问
首先通过NuGet安装Microsoft.EntityFrameworkCore.InMemory,
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(14)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/998c6ead747c4bb6bfd40ef89751fea1.jpg)
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(15)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/6d035749df7744ff93329b09586fa346.jpg)
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(16)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/4691d625b1794373ae832a57cbd4e991.jpg)
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(17)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/758d61230077473fa45ed9d330be857f.jpg)
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(18)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/1f4125ad265644409b0cab09513a8cbf.jpg)
新建一个名为DemoContext的数据库上下文类并继承DbContext类
1
2
3
4
5
6
|
public class DemoContext: DbContext
{
public DemoContext(DbContextOptions<DemoContext> options) : base(options) { }
public DbSet<Order> Orders { get; set; }=null!;
}
|
在Program.cs中注册数据库上下文
1
|
builder.Services.AddDbContext<DemoContext>(opt => { opt.UseInMemoryDatabase("Demo"); }); //Demo为数据库名
|
新增接口
新建一个API控制器,在选中模型后,会安装一些依赖包,我们需要耐心的等待一下
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(19)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/1601a65368b44bcd882f6a1e3797b02b.jpg)
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(20)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/8638e53650ec48ce84d674319494a364.jpg)
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(21)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/b76b260d2413462ea700a90ca08181b9.jpg)
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(22)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/ea2f3c6dcf714e7693ee7bb9b24fde9e.jpg)
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(23)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/ec2de1594d4d410db6ceb667dd9fb699.jpg)
VS会为我们生成比较全的CRUD代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
[Route("api/[controller]")]
[ApiController]
public class OrdersController : ControllerBase
{
private readonly DemoContext _context;
public OrdersController(DemoContext context)
{
_context = context;
}
// GET: api/Orders
[HttpGet]
public async Task<ActionResult<IEnumerable<Order>>> GetOrders()
{
return await _context.Orders.ToListAsync();
}
// GET: api/Orders/5
[HttpGet("{id}")]
public async Task<ActionResult<Order>> GetOrder(long id)
{
var order = await _context.Orders.FindAsync(id);
if (order == null)
{
return NotFound();
}
return order;
}
// PUT: api/Orders/5
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPut("{id}")]
public async Task<IActionResult> PutOrder(long id, Order order)
{
if (id != order.Id)
{
return BadRequest();
}
_context.Entry(order).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!OrderExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
// POST: api/Orders
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPost]
public async Task<ActionResult<Order>> PostOrder(Order order)
{
_context.Orders.Add(order);
await _context.SaveChangesAsync();
return CreatedAtAction("GetOrder", new { id = order.Id }, order);
}
// DELETE: api/Orders/5
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteOrder(long id)
{
var order = await _context.Orders.FindAsync(id);
if (order == null)
{
return NotFound();
}
_context.Orders.Remove(order);
await _context.SaveChangesAsync();
return NoContent();
}
private bool OrderExists(long id)
{
return _context.Orders.Any(e => e.Id == id);
}
}
|
代码中我们可以看到4种接口请求方式HttpGet(查询)、HttpPut(修改)、HttpPost(新增)、HttpDelete(删除),Route中也带有api路径,我们的接口便在api目录下,此时,我们运行起来便可在Swagger中看到刚才新增的接口
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(24)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/a5143fc13e8c4d039466906c12165737.jpg)
我们通过POST请求api/Orders来新增一条数据
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(25)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/b0e898918bbd4906af71dbb55efecaa5.jpg)
再通过GET请求api/Orders来查询数据列表
![asp.net web api设计(跟着官网学ASP.NETCore6.0之创建WebApi项目)(26)](http://img.studyofnet.com/uploads9/3/tos-cn-i-qvj2lq49k0/21f459d1b65241db82a2f0c679eb13c2.jpg)
这里只是跟着官方教程创建好一个项目以及如何创建新的WebApi,示例中的数据是存储在内存中的,下一节,我们便跟着官方教程来学习如果用过EF Core 6访问数据库
,