.NET之WebAPI
介绍
通过一个简单的项目,总结一下常用的几种WebApi编写方式以及请求方式。
本文示例代码环境:vs2019、net5、MySQL
正文前准备
新创建了一个.Net5 WebAPI程序,安装组件
<PackageReference Include="AutoMapper" Version="10.1.1" />
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="8.1.1" />
<PackageReference Include="Common.EFCoreConfigurations" Version="1.0.0" /> <!--自己测试使用封装的nuget包-->
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.6" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.6.3" />
ConfigureServices配置NewtonsoftJson以及Automapper和操作数据库代码
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers().AddNewtonsoftJson();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "MyWebApi", Version = "v1" });
});
// 自己测试使用所以封装了一个连接数据库的操作
services.AddMySQLService<OpenContext>("Server=localhost;Database=test;Port=3306;charset=utf8;uid=root;pwd=123456;");
//注入AutoMapper
services.AddAutoMapper(Assembly.GetExecutingAssembly().DefinedTypes.Where(t => typeof(Profile).GetTypeInfo()
.IsAssignableFrom(t.AsType())).Select(t => t.AsType()).ToArray());
}
注意:在Net core3.0以后,微软移除了Newtonsoft.Json,而使用了System.Text.Json,所以依赖于Newtonsoft.Json的组件将不可用,需要安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson 包
新增一个用户控制器,里面包含了get、post、put、patch、delete几种类型的接口。这里先不贴代码,一点一点看。通过一个用户的添加、修改、删除作为一个演示的流程。
记得配置允许跨域请求,要不js请求会报错。详情看此处
数据表结构如下
POST
约定用于向服务端提交数据操作,请求时候参数放在参数FromBody传递,这里我们用于添加用户操作
前端
var par = { "account": "张三", "passWord": "123456" };
$.ajax({
type: "post",
dataType: 'json',
contentType: "application/json",
url: "http://localhost:5000/api/User",
data: JSON.stringify(par),
success: function (data) {
console.log(data);
}
});
后端
[HttpPost]
public async Task<string> AddAsync(AddUserVm dto)
{
var exist = await _context.Set<User>().AsNoTracking().AnyAsync(t => !t.IsValid && t.Account == dto.Account);
if (exist)
throw new Exception("帐号重复");
var user = _mapper.Map<User>(dto);
await _context.Set<User>().AddAsync(user);
await _context.SaveChangesAsync();
return user.Id;
}
Postman
URL:http://localhost:5000/api/User
传递参数格式为json格式,请求头部默认添加:"Content-Type", "application/json"
GET
传递参数的本质是url字符串拼接,Request-Head头部传递,Request-Body中不能传递,查询我们刚才添加的用户信息
后端
[HttpGet]
public async Task<ActionResult<List<User>>> Get()
{
return await _context.Set<User>().AsNoTracking().ToListAsync().ConfigureAwait(false);
}
本次示例直接将实体类返回了,生产环境不建议如此操作。
前端
$.ajax({
type: "get",
url: "http://localhost:5000/api/User",
contentType: "application/json",
success: function (data, status) {
console.log(JSON.stringify(data));
}
});
Postman
url:http://localhost:5000/api/User
返回结果
PUT
更新用户信息
前端
var par = { "account": "张三", "passWord": "123456" };
$.ajax({
url: "http://localhost:5000/api/User/1394282152006258688",
type: "PUT",
contentType: "application/json",
data: JSON.stringify(par),
success: function (result) {
console.log(result);
}
});
后端
[HttpPut("{id}")]
public async Task<ActionResult> Put(string id, [FromBody] UpdateUserVm dto)
{
var entity = await _context.Set<User>().FindAsync(id).ConfigureAwait(false);
if (entity is null)
return NotFound();
if (!string.IsNullOrWhiteSpace(dto.Account))
entity.Account = dto.Account;
if (!string.IsNullOrWhiteSpace(dto.PassWord))
entity.PassWord = dto.PassWord;
_context.Set<User>().Update(entity);
await _context.SaveChangesAsync();
return Ok("成功");
}
Postman
URL:http://localhost:5000/api/User/1394282152006258688
参数传递:Body=>raw=>json
{
"account": "张三",
"passWord": "333333"
}
DELETE
删除用户信息
前端
$.ajax({
url: "http://localhost:5000/api/User/1394282152006258688",
type: "DELETE",
success: function (result) {
console.log(result);
}
});
后端
[HttpDelete("{id}")]
public async Task<ActionResult> DeleteAsync(string id)
{
var entity = await _context.Set<User>().FindAsync(id).ConfigureAwait(false);
if (entity is null)
return NotFound();
entity.IsValid = false;
_context.Update(entity);
await _context.SaveChangesAsync();
return Ok("成功");
}
Postman
URL:http://localhost:5000/api/User/1394282152006258688
Patch
在此用于更新数据
请求格式:[{"op" : "replace", "path" : "/PassWord", "value" : "222222"}]
add:添加属性或数组元素。 对于现有属性:设置值。
remove:删除属性或数组元素。
replace:替换操作
前端
var par = [{"op" : "replace", "path" : "/PassWord", "value" : "222222"}];
$.ajax({
url: "http://localhost:5000/api/User/1394282152006258688",
type: "Patch",
contentType: "application/json",
data: JSON.stringify(par),
success: function (result) {
console.log(result);
}
});
后端
[HttpPatch("{id}")]
public async Task<ActionResult<string>> PatchAsync([FromRoute] string id, JsonPatchDocument<UpdateUserVm> jsonPatch)
{
var entity = await _context.Set<User>().AsNoTracking().FirstOrDefaultAsync(t => t.Id == id && !t.IsValid).ConfigureAwait(false);
if (entity is null)
return NotFound();
var dto = _mapper.Map<UpdateUserVm>(entity);
jsonPatch.ApplyTo(dto, ModelState);
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var user = await _context.Set<User>().FindAsync(id).ConfigureAwait(false);
_mapper.Map(dto,user);
_context.Set<User>().Update(user);
await _context.SaveChangesAsync().ConfigureAwait(false);
return entity.Id;
}
Postman
更新
URL:http://localhost:5000/api/User/1394214078116794368
参数传递:Body=>raw=>json
[{"op" : "replace", "path" : "/PassWord", "value" : "222222"}]
op属性指示操作的类型,path属性指示要更新的元素,value属性提供新值。
参考文档:https://docs.microsoft.com/zh-cn/aspnet/core/web-api/jsonpatch?view=aspnetcore-5.0
微信公众号
.NET之WebAPI的更多相关文章
- webapi - 使用依赖注入
本篇将要和大家分享的是webapi中如何使用依赖注入,依赖注入这个东西在接口中常用,实际工作中也用的比较频繁,因此这里分享两种在api中依赖注入的方式Ninject和Unity:由于快过年这段时间打算 ...
- ASP.NET Core MVC/WebAPi 模型绑定探索
前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...
- Asp.Net WebApi核心对象解析(下篇)
在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...
- Taurus.MVC 2.2 开源发布:WebAPI 功能增强(请求跨域及Json转换)
背景: 1:有用户反馈了关于跨域请求的问题. 2:有用户反馈了参数获取的问题. 3:JsonHelper的增强. 在综合上面的条件下,有了2.2版本的更新,也因此写了此文. 开源地址: https:/ ...
- Taurus.MVC 2.0 开源发布:WebAPI开发教程
背景: 有用户反映,Tausus.MVC 能写WebAPI么? 能! 教程呢? 嗯,木有! 好吧,刚好2.0出来,就带上WEBAPI教程了! 开源地址: https://github.com/cyq1 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(64)-补充WebApi与Unity注入-配置文件
系列目录 上一篇演示了WebApi利用Unity注入 很多人问我如何用配置文件来配置注入,本节演示如何利用配置文件来注入,道理是一样的,跳转到上一节下载源码一起来动手! 1.打开源码定位到文件Depe ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(66)-MVC WebApi 用户验证 (2)
系列目录 前言: 回顾上一节,我们利用webapi简单的登录并进行了同域访问与跨域访问来获得Token,您可以跳转到上一节下载代码来一起动手. 继续上一篇的文章,我们接下来演示利用拿到的Token来访 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(65)-MVC WebApi 用户验证 (1)
系列目录 前言: WebAPI主要开放数据给手机APP,其他需要得知数据的系统,或者软件应用,所以移动端与系统的数据源往往是相通的. Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能, ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(64)-WebApi与Unity注入
系列目录 前言: 有时候我们系统需要开放数据给手机App端或其他移动设备,不得不说Asp.net WebApi是目前首选 本节记录Asp.net MVC WebApi怎么利用Unity注入.系列开头已 ...
- WebAPi之SelfHost自创建证书启动Https疑难解惑及无法正确返回结果
前言 话说又来需求了,之前对于在SelfHost中需要嵌套页面并操作为非正常需求,这回来正常需求了,客户端现在加了https,老大过来说WebAPi访问不了了,这是什么情况,我去试了试,还真是这个情况 ...
随机推荐
- Web实验报告
- 真会C#微信小程序的习题数据JSON文件下载链接
完全没有精力去维护了,所以小程序停掉,集中精力做一件事. 链接: https://pan.baidu.com/s/1xL45KxDzR5oEQM6nwBA5rw 提取码: qv6n
- golang 性能调优分析工具 pprof (上)
一.golang 程序性能调优 在 golang 程序中,有哪些内容需要调试优化? 一般常规内容: cpu:程序对cpu的使用情况 - 使用时长,占比等 内存:程序对cpu的使用情况 - 使用时长,占 ...
- JMeter元件作用域实践指南
从一个问题说起 对于以下测试脚本: 为了能调用进入房间接口,需要从考场接口获取考场token.为了调用考场接口,需要从登陆接口获取登陆token.元件说明如下: 学生登录,提取登录${token}传入 ...
- 我成为 Microsofti Azure MVP 啦!(ps:不是美国职业篮球)
一,引言 今天是个高兴的日子,早上10点左右收到了来自微软的MVP的礼包的快递,对我来说,这是一件很值得纪念的日子.所以今天就水一篇心得感想吧!!! 我是年前2月9号开始申请MVP的,经历了差不多1个 ...
- 从西天取经的九九八十一难来看Java设计模式:模板方法模式
目录 示例 模板方法模式 定义 意图 主要解决问题 适用场景 优缺点 西天取经的九九八十一难 示例 当我们设计一个类时,我们能明确它对外提供的某个方法的内部执行步骤, 但一些步骤,不同的子类有不同的行 ...
- Prometheus【node_exporter】+grafana监控云主机
下面说一下这个开源软件的安装实践过程,目标如下: 在监控服务器上安装prometheus 在被监控环境上安装exporter 安装grafana 在监控服务器上安装prometheus 开始安装pro ...
- php正则表达式过滤空格 换行符 回车
我整理了几个比较适合的实例了,对于它们我们是有很多站长都测试过并用过了,不过文章最后我的总结也是生重要的哦,至于原因我也说不上了,因为chr是ascii编码了所以有时浏览器会自动转成ascii,特别像 ...
- POJ2983 查分约束系统
题意: 给你n个点,然后给你两种情况,P a b c,表明a在b的北边c那么远,V a b 表明a在b的北边(距离最少是1),问你这些条件是否冲突. 思路: 一开始想用带权并 ...
- POJ3228二分最大流
题意: 有n个点,每个点有两个权值,金子数量还有仓库容量,金子可以存在自己的仓库里或者是别的仓库里,仓库和仓库之间有距离,问所有金子都必须存到库里最大距离的最小是多少? 思路: ...