asp.net core系列 36 WebAPI 搭建详细示例
一.概述
HTTP不仅仅用于提供网页。HTTP也是构建公开服务和数据的API强大平台。HTTP简单灵活且无处不在。几乎任何你能想到的平台都有一个HTTP库,因此HTTP服务可以覆盖广泛的客户端,包括浏览器,移动设备和传统的桌面应用程序。
ASP.NET Web API 是一个框架,基于.NET Framework 或.NET Core 之上构建 Web API。
从本章开始学习Web API系列时,先从一个示例开始,下面使用ASP.NET Core MVC 创建 Web API。通过本次演示将了解到一个基础的Web API应用。环境使用vs 2017 +sql server 2012。示例主要知识点包括:
(1)创建 Web API 项目。
(2)添加模型类。
(3)创建数据库上下文。
(4)注册数据库上下文。
(5)添加控制器。
(6)添加 CRUD 方法。
(7)配置路由和 URL 路径。
(8)指定返回值。
(9)使用Fiddle调用 Web API。
(10)使用 jQuery 调用 Web API。
在开发Web API之前,先制定几个有针对性的API 接口,至于api 接口业务很简单,主要是演示如何应用Web API。
API接口 |
说明 |
请求报文 |
响应报文 |
GET /api/todo |
获取所有待办事项 |
无 |
待办事项的数据 |
GET /api/todo/{id} |
按 ID 获取项 |
无 |
待办事项 |
POST /api/todo |
添加新项 |
待办事项 |
待办事项 |
PUT /api/todo/{id} |
更新现有项 |
待办事项 |
无 |
DELETE /api/todo/{id} |
删除项 |
无 |
无 |
1.1 创建web项目
(1)从“文件”菜单中选择“新建” > “项目”。
(2)选择“ASP.NET Core Web 应用程序”模板。 将项目命名为 TodoApi,然后单击“确定”。
(3)在“新建 ASP.NET Core Web 应用程序 - TodoApi”对话框中,选择 ASP.NET Core 版本。 选择“API”模板,然后单击“确定”。 请不要选择“启用 Docker 支持”。
项目模板会创建 values
API。 控制器方法中默认的Http[Verb] 属性路由包括GET,POST, PUT, DELETE接口
1.2 添加模型类
在项目中,添加Models文件夹,新建一个 TodoItem
类,如下所示:
public class TodoItem
{
//主键
public long Id { get; set; }
//待办事项名称
public string Name { get; set; }
//是否完成
public bool IsComplete { get; set; }
}
1.3 添加数据库上下文
在“Models”文件夹,然后选择“添加” > “类”。 将类命名为 TodoContext,如下所示:
//using Microsoft.EntityFrameworkCore;
public class TodoContext: DbContext
{
public TodoContext(DbContextOptions<TodoContext> options)
: base(options)
{
} public DbSet<TodoItem> TodoItems { get; set; }
}
1.4 注册上下文
在 ASP.NET Core 中,服务(如数据库上下文)必须向依赖关系注入 (DI) 容器进行注册。 该容器向控制器提供服务。这里使用Microsoft.EntityFrameworkCore.SqlServer数据提供程序。再根据模型生成数据库表(库名Todo,有一个表TodoItem)。关于如何安装数据提供程序,以及如何用模型生成数据库表,请参考“asp.net core 系列第 20 篇” 。使用迁移生成数据库后,如下所示:
1.5 添加控制器
在Controllers 文件夹中,选择“API 控制器类”模板。将类命名为 TodoController.cs, 代码如下所示:
[Route("api/[controller]")]
[ApiController]//添加特性,代表是一个Web API控制器类
public class TodoController : Controller
{
private readonly TodoContext _context; /// <summary>
/// 实例化一个EF上下文,进行数据库操作。开始初始入库一条数据
/// </summary>
/// <param name="context"></param>
public TodoController(TodoContext context)
{
_context = context; if (_context.TodoItems.Count() == )
{
// Create a new TodoItem if collection is empty,
// which means you can't delete all TodoItems.
_context.TodoItems.Add(new TodoItem { Name = "Item1" });
_context.SaveChanges();
}
}
}
1.6 添加GET方法
通过GET方法来查询待办事项的 API,将以下方法添加到 TodoController 类中。关于路由知识,请参考asp.net core 系列第5篇。
/// <summary>
/// 获取所有事项
/// GET: api/Todo
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<ActionResult<IEnumerable<TodoItem>>> GetTodoItems()
{
//using Microsoft.EntityFrameworkCore;
return await _context.TodoItems.ToListAsync();
} /// <summary>
/// 根据id,获取一条事项
/// GET: api/Todo/5。 id 是参数,代表路由合并
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}")]
public async Task<ActionResult<TodoItem>> GetTodoItem(long id)
{
var todoItem = await _context.TodoItems.FindAsync(id);
if (todoItem == null)
{
return NotFound();
}
return todoItem;
}
启动vs,测试结果,如下所示,注意请求wep api 地址与action的方法名没有关系,是根据方法名之上的Http[Verb]特性来确定url地址的:
1.7 路由和URL路径
(1) Route特性
Route是用来制定路由模板的,在第5章中也讲到。[Route("api/[controller]")]中是以api开头,替换[controller]
为控制器的名称, 按照惯例,控制器类名称减去“Controller”后缀, 因此控制器名称为“todo” ,路由不区分大小写。
(2) HttpGet
如果[HttpGet]
属性具有路径模板,例如:[HttpGet("{id}")]
,
则将其
附加到路径
(如:api/todo/1)
。在这个示例中
,
"{id}"
是占位符变量,用于待办事项的唯一标识符。
1.8 返回值
上面的GetTodoItems和GetTodoItem方法的返回类型是ActionResult <T>类型。ASP.NET Core自动将对象序列化为JSON,并将JSON写入响应消息的正文中。假设没有异常,此返回类型的响应代码为200。未处理的异常被转换为5xx错误。
ActionResult
返回类型可以表示各种HTTP状态代码,例如在上面的GetTodoItem
方法中
可以返回两个不同的状态值:一个是成功的200, 一个是404未到找。所有的HTTP状态代码可以在ControllerBase中找到,例如下图中的Forbid() 是Http状态码403,NoContent()是Http 状态码204 。 等等
二.测试Web API
下面简单使用Fiddler来测试一下增删改增。先在本机vs 2017中启动该项目,地址为http://localhost:62271。
2.1 查询
在Fiddler工具中,选择GET,输入查询的http地址,右边是响应的http 状态码200, 以及查询的json结构对象。
2.2 新增
下面创建方法,添加以下 PostTodoItem 方法,在新增方法中调用了CreatedAtAction内置方法,如果新增成功,则返回 HTTP 201 状态代码。HTTP 201是HTTP POST方法的标准响应,该方法在服务器上创建新资源。
//POST: api/Todo
[HttpPost]
public async Task<ActionResult<TodoItem>> PostTodoItem(TodoItem item)
{
_context.TodoItems.Add(item);
await _context.SaveChangesAsync();
return CreatedAtAction(nameof(GetTodoItem), new { id = item.Id }, item);
}
2.3 修改
添加以下 PutTodoItem
方法, PutTodoItem 与 PostTodoItem 类似,但是使用的是 HTTP PUT。 响应是 204(无内容)。 根据 HTTP 规范,PUT 请求需要客户端发送整个更新的实体,而不仅仅是更改。若要支持部分更新,请使用HttpPatch特性。
// PUT: api/Todo/1
[HttpPut("{id}")]
public async Task<IActionResult> PutTodoItem(long id, TodoItem item)
{
if (id != item.Id)
{
//http 403
return BadRequest();
}
//当前传过来的实体添加到上下文,并设置为修改
_context.Entry(item).State = EntityState.Modified;
await _context.SaveChangesAsync(); return NoContent();
}
2.4 删除
// DELETE: api/Todo/2
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteTodoItem(long id)
{
var todoitem = await _context.TodoItems.FindAsync(id);
if (todoitem == null)
{
return NotFound();
} _context.TodoItems.Remove(todoitem);
await _context.SaveChangesAsync(); return NoContent();
}
最后:关于jQuery 调用 Web API,不再演示,jQuery调用的配置和注意事项,请查看官网介绍。
备注: api站点添加静态资源访问,如访问localhost:8080/Resource/ikdict/extword.txt
app.UseStaticFiles(new StaticFileOptions()
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), @"Resource/IKdict")),//这是本机路径
RequestPath = new PathString("/Resource/IKdict")//访问路径
});
参考文献:
asp.net core系列 36 WebAPI 搭建详细示例的更多相关文章
- asp.net core系列 38 WebAPI 返回类型与响应格式--必备
一.返回类型 ASP.NET Core 提供以下 Web API Action方法返回类型选项,以及说明每种返回类型的最佳适用情况: (1) 固定类型 (2) IActionResult (3) Ac ...
- asp.net core 系列之webapi集成EFCore的简单操作教程
因为官网asp.net core webapi教程部分,给出的是使用内存中的数据即 UseInMemoryDatabase 的方式, 这里记录一下,使用SQL Server数据库的方式即 UseSql ...
- asp.net core系列 37 WebAPI 使用OpenAPI (swagger)中间件
一.概述 在使用Web API时,对于开发人员来说,了解其各种方法可能是一项挑战.在ASP.NET Core上,Web api 辅助工具介绍二个中间件,包括:Swashbuckle和NSwag .NE ...
- asp.net core 系列之webapi集成Dapper的简单操作教程
Dapper也是是一种ORM框架 这里记录下,使用ASP.NET 集成 Dapper 的过程,方便自己查看 至于Dapper的特性以及操作可以参考Dapper官方文档 1.创建数据库相关 在Sql S ...
- asp.net core系列 77 webapi响应压缩
一.介绍 背景:目前在开发一个爬虫框架,使用了.net core webapi接口作为爬虫调用入口,在调用 webapi时发现爬虫耗时很短(1秒左右),但客户端获取响应时间却在3~4秒.对于这个问题考 ...
- asp.net core系列 WebAPI 作者:懒懒的程序员一枚
asp.net core系列 36 WebAPI 搭建详细示例一.概述1.1 创建web项目1.2 添加模型类1.3 添加数据库上下文1.4 注册上下文1.5 添加控制器1.6 添加Get方法1.7 ...
- 【目录】asp.net core系列篇
随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...
- WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化
WPF中的常用布局 一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...
- asp.net core系列 40 Web 应用MVC 介绍与详细示例
一. MVC介绍 MVC架构模式有助于实现关注点分离.视图和控制器均依赖于模型. 但是,模型既不依赖于视图,也不依赖于控制器. 这是分离的一个关键优势. 这种分离允许模型独立于可视化展示进行构建和测试 ...
随机推荐
- java笔记:排错5:误删maven target:恢复不了,怎么再生成
上篇讲过,误删maven项目的target,或clean以后,target文件夹会删掉. 想要重新加载模块生成最新的target目录,可以再跑一下tomcat. 但有时不灵,可能是因为Tomcat本身 ...
- 南京邮电大学//bugkuCTF部分writeup
WEB 1.签到题 nctf{flag_admiaanaaaaaaaaaaa} 右键查看源代码或按f12即可. 2.这题不是web nctf{photo_can_also_hid3_msg} 下载图片 ...
- c++之STL容器删除元素
1.删除容器中特定值的元素 如果是容器vector,string,,deque,使用erase-remove 例如:erase-remove 注:因为container没有remove,contain ...
- 安装VUE Cli3 框架方法
下面为大家介绍一下怎样安装 VUE Cli3的步骤 官网地址 https://cli.vuejs.org/zh/guide/installation.html 一.首先要检查一下是否安装node环 ...
- win10系统盘分多大合适?
WIN10系统盘分多大合适,想必许多网友在装系统的时候都犹豫不觉吧,不过现在的硬盘基本上都是512G 1T的机械硬盘,固态硬盘基本都是128G以上,256G几乎成为标配,所以WIN10系统盘空间还是足 ...
- 新装云服务器没有iptables 文件,并且无法通过service iptables save操作
在安装zookeeper时,需要放开端口2181 按照视频教程在 /etc/sysconfig/ 下对iptables 文件进行编辑,但是该目录下没有此文件 通过强行写iptables -P OUT ...
- FCC学习笔记(三)
Using Objects for Lookups // 定义 phoneticLookupfunction phoneticLookup(val) { var result = "&quo ...
- maven build时报错Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
[INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ ...
- react生命周期函数
如图,可以把组件生命周期大致分为三个阶段: 第一阶段:是组件第一次绘制阶段,如图中的上面虚线框内,在这里完成了组件的加载和初始化: 第二阶段:是组件在运行和交互阶段,如图中左下角虚线框,这个阶段组 ...
- 浅谈微信小程序一二
1.生命周期 1.onLoad():页面加载时触发,一个页面只加载一次. 2.onShow():页面显示切换的时候触发 3.onReady():页面初次渲染完成时触发.一个页面只会调用一次,代表页面已 ...