介绍

通过一个简单的项目,总结一下常用的几种WebApi编写方式以及请求方式。

本文示例代码环境:vs2019、net5、MySQL

正文前准备

新创建了一个.Net5 WebAPI程序,安装组件

  1. <PackageReference Include="AutoMapper" Version="10.1.1" />
  2. <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="8.1.1" />
  3. <PackageReference Include="Common.EFCoreConfigurations" Version="1.0.0" /> <!--自己测试使用封装的nuget包-->
  4. <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.6" />
  5. <PackageReference Include="Swashbuckle.AspNetCore" Version="5.6.3" />

ConfigureServices配置NewtonsoftJson以及Automapper和操作数据库代码

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddControllers().AddNewtonsoftJson();
  4. services.AddSwaggerGen(c =>
  5. {
  6. c.SwaggerDoc("v1", new OpenApiInfo { Title = "MyWebApi", Version = "v1" });
  7. });
  8. // 自己测试使用所以封装了一个连接数据库的操作
  9. services.AddMySQLService<OpenContext>("Server=localhost;Database=test;Port=3306;charset=utf8;uid=root;pwd=123456;");
  10. //注入AutoMapper
  11. services.AddAutoMapper(Assembly.GetExecutingAssembly().DefinedTypes.Where(t => typeof(Profile).GetTypeInfo()
  12. .IsAssignableFrom(t.AsType())).Select(t => t.AsType()).ToArray());
  13. }

注意:在Net core3.0以后,微软移除了Newtonsoft.Json,而使用了System.Text.Json,所以依赖于Newtonsoft.Json的组件将不可用,需要安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson 包

新增一个用户控制器,里面包含了get、post、put、patch、delete几种类型的接口。这里先不贴代码,一点一点看。通过一个用户的添加、修改、删除作为一个演示的流程。

记得配置允许跨域请求,要不js请求会报错。详情看此处

数据表结构如下

POST

约定用于向服务端提交数据操作,请求时候参数放在参数FromBody传递,这里我们用于添加用户操作

前端

  1. var par = { "account": "张三", "passWord": "123456" };
  2. $.ajax({
  3. type: "post",
  4. dataType: 'json',
  5. contentType: "application/json",
  6. url: "http://localhost:5000/api/User",
  7. data: JSON.stringify(par),
  8. success: function (data) {
  9. console.log(data);
  10. }
  11. });

后端

  1. [HttpPost]
  2. public async Task<string> AddAsync(AddUserVm dto)
  3. {
  4. var exist = await _context.Set<User>().AsNoTracking().AnyAsync(t => !t.IsValid && t.Account == dto.Account);
  5. if (exist)
  6. throw new Exception("帐号重复");
  7. var user = _mapper.Map<User>(dto);
  8. await _context.Set<User>().AddAsync(user);
  9. await _context.SaveChangesAsync();
  10. return user.Id;
  11. }

Postman

URL:http://localhost:5000/api/User

传递参数格式为json格式,请求头部默认添加:"Content-Type", "application/json"

GET

传递参数的本质是url字符串拼接,Request-Head头部传递,Request-Body中不能传递,查询我们刚才添加的用户信息

后端

  1. [HttpGet]
  2. public async Task<ActionResult<List<User>>> Get()
  3. {
  4. return await _context.Set<User>().AsNoTracking().ToListAsync().ConfigureAwait(false);
  5. }

本次示例直接将实体类返回了,生产环境不建议如此操作。

前端

  1. $.ajax({
  2. type: "get",
  3. url: "http://localhost:5000/api/User",
  4. contentType: "application/json",
  5. success: function (data, status) {
  6. console.log(JSON.stringify(data));
  7. }
  8. });

Postman

url:http://localhost:5000/api/User

返回结果

PUT

更新用户信息

前端

  1. var par = { "account": "张三", "passWord": "123456" };
  2. $.ajax({
  3. url: "http://localhost:5000/api/User/1394282152006258688",
  4. type: "PUT",
  5. contentType: "application/json",
  6. data: JSON.stringify(par),
  7. success: function (result) {
  8. console.log(result);
  9. }
  10. });

后端

  1. [HttpPut("{id}")]
  2. public async Task<ActionResult> Put(string id, [FromBody] UpdateUserVm dto)
  3. {
  4. var entity = await _context.Set<User>().FindAsync(id).ConfigureAwait(false);
  5. if (entity is null)
  6. return NotFound();
  7. if (!string.IsNullOrWhiteSpace(dto.Account))
  8. entity.Account = dto.Account;
  9. if (!string.IsNullOrWhiteSpace(dto.PassWord))
  10. entity.PassWord = dto.PassWord;
  11. _context.Set<User>().Update(entity);
  12. await _context.SaveChangesAsync();
  13. return Ok("成功");
  14. }

Postman

URL:http://localhost:5000/api/User/1394282152006258688

参数传递:Body=>raw=>json

  1. {
  2. "account": "张三",
  3. "passWord": "333333"
  4. }

DELETE

删除用户信息

前端

  1. $.ajax({
  2. url: "http://localhost:5000/api/User/1394282152006258688",
  3. type: "DELETE",
  4. success: function (result) {
  5. console.log(result);
  6. }
  7. });

后端

  1. [HttpDelete("{id}")]
  2. public async Task<ActionResult> DeleteAsync(string id)
  3. {
  4. var entity = await _context.Set<User>().FindAsync(id).ConfigureAwait(false);
  5. if (entity is null)
  6. return NotFound();
  7. entity.IsValid = false;
  8. _context.Update(entity);
  9. await _context.SaveChangesAsync();
  10. return Ok("成功");
  11. }

Postman

URL:http://localhost:5000/api/User/1394282152006258688

Patch

在此用于更新数据

请求格式:[{"op" : "replace", "path" : "/PassWord", "value" : "222222"}]

add:添加属性或数组元素。 对于现有属性:设置值。

remove:删除属性或数组元素。

replace:替换操作

前端

  1. var par = [{"op" : "replace", "path" : "/PassWord", "value" : "222222"}];
  2. $.ajax({
  3. url: "http://localhost:5000/api/User/1394282152006258688",
  4. type: "Patch",
  5. contentType: "application/json",
  6. data: JSON.stringify(par),
  7. success: function (result) {
  8. console.log(result);
  9. }
  10. });

后端

  1. [HttpPatch("{id}")]
  2. public async Task<ActionResult<string>> PatchAsync([FromRoute] string id, JsonPatchDocument<UpdateUserVm> jsonPatch)
  3. {
  4. var entity = await _context.Set<User>().AsNoTracking().FirstOrDefaultAsync(t => t.Id == id && !t.IsValid).ConfigureAwait(false);
  5. if (entity is null)
  6. return NotFound();
  7. var dto = _mapper.Map<UpdateUserVm>(entity);
  8. jsonPatch.ApplyTo(dto, ModelState);
  9. if (!ModelState.IsValid)
  10. {
  11. return BadRequest(ModelState);
  12. }
  13. var user = await _context.Set<User>().FindAsync(id).ConfigureAwait(false);
  14. _mapper.Map(dto,user);
  15. _context.Set<User>().Update(user);
  16. await _context.SaveChangesAsync().ConfigureAwait(false);
  17. return entity.Id;
  18. }

Postman

更新

URL:http://localhost:5000/api/User/1394214078116794368

参数传递:Body=>raw=>json

  1. [{"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的更多相关文章

  1. webapi - 使用依赖注入

    本篇将要和大家分享的是webapi中如何使用依赖注入,依赖注入这个东西在接口中常用,实际工作中也用的比较频繁,因此这里分享两种在api中依赖注入的方式Ninject和Unity:由于快过年这段时间打算 ...

  2. ASP.NET Core MVC/WebAPi 模型绑定探索

    前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...

  3. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  4. Taurus.MVC 2.2 开源发布:WebAPI 功能增强(请求跨域及Json转换)

    背景: 1:有用户反馈了关于跨域请求的问题. 2:有用户反馈了参数获取的问题. 3:JsonHelper的增强. 在综合上面的条件下,有了2.2版本的更新,也因此写了此文. 开源地址: https:/ ...

  5. Taurus.MVC 2.0 开源发布:WebAPI开发教程

    背景: 有用户反映,Tausus.MVC 能写WebAPI么? 能! 教程呢? 嗯,木有! 好吧,刚好2.0出来,就带上WEBAPI教程了! 开源地址: https://github.com/cyq1 ...

  6. ASP.NET MVC5+EF6+EasyUI 后台管理系统(64)-补充WebApi与Unity注入-配置文件

    系列目录 上一篇演示了WebApi利用Unity注入 很多人问我如何用配置文件来配置注入,本节演示如何利用配置文件来注入,道理是一样的,跳转到上一节下载源码一起来动手! 1.打开源码定位到文件Depe ...

  7. ASP.NET MVC5+EF6+EasyUI 后台管理系统(66)-MVC WebApi 用户验证 (2)

    系列目录 前言: 回顾上一节,我们利用webapi简单的登录并进行了同域访问与跨域访问来获得Token,您可以跳转到上一节下载代码来一起动手. 继续上一篇的文章,我们接下来演示利用拿到的Token来访 ...

  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统(65)-MVC WebApi 用户验证 (1)

    系列目录 前言: WebAPI主要开放数据给手机APP,其他需要得知数据的系统,或者软件应用,所以移动端与系统的数据源往往是相通的. Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能, ...

  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统(64)-WebApi与Unity注入

    系列目录 前言: 有时候我们系统需要开放数据给手机App端或其他移动设备,不得不说Asp.net WebApi是目前首选 本节记录Asp.net MVC WebApi怎么利用Unity注入.系列开头已 ...

  10. WebAPi之SelfHost自创建证书启动Https疑难解惑及无法正确返回结果

    前言 话说又来需求了,之前对于在SelfHost中需要嵌套页面并操作为非正常需求,这回来正常需求了,客户端现在加了https,老大过来说WebAPi访问不了了,这是什么情况,我去试了试,还真是这个情况 ...

随机推荐

  1. 后台开发-核心技术与应用实践--TCP协议

    网络模型 为使不同计算机厂家的计算机能够互相通信,国际标准化组织 ISO 1981 年正式推荐了一个网络系统结构一一七层参考模型,也叫作开放系统互连模型. ISO 七层网络模型及其功能展示: 这个七层 ...

  2. 新元科技签订5.8亿元IPFS合同,IPFS国家认可吗?IPFS挖矿是不是合法的?

    就在昨天,也就是 3 月 15 日,FIL 又有一波较大的涨幅,现流通市值排名第 15,总市值预计 6818.16 亿.FIL 见涨,一些公司也按耐不住了.也是在3月15日,A 股上市公司新元科技签订 ...

  3. 1、Spring教程之Spring概述

    1.Spring概述 简介 Spring : 春天 --->给软件行业带来了春天 2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架. 2004年3月24 ...

  4. restful设计风格

    restful是一种软件设计风格,并不是标准,它只是提供了一组设计原则和约束条件. ① restful 提倡面向资源编程,url接口尽量要使用名词,不要使用动词 ② 在url中可以体现版本号 ③可以根 ...

  5. [set]JZOJ 5821 手机信号

    Description

  6. (二)SpringBoot启动过程的分析-环境信息准备

    -- 以下内容均基于2.1.8.RELEASE版本 由上一篇SpringBoot基本启动过程的分析可以发现在run方法内部启动SpringBoot应用时采用多个步骤来实现,本文记录启动的第二个环节:环 ...

  7. java例题_50 题目:有五个学生,每个学生有 3 门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成 绩),计算出平均成绩,将原有的数据和计算出的平均分数存放在磁盘文件"stud"中。

    1 /*50 [程序 50 文件 IO] 2 题目:有五个学生,每个学生有 3 门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成 3 绩),计算出平均成绩,将原有的数据和计算出的平均分数存放 ...

  8. Androi Studio 之 RelativeLayout

    RelativeLayout简介 •基本属性 •根据父容器定位 •父容器定位属性示意图 •根据兄弟组件定位 •根据兄弟组件定位 •margin(偏移) •padding(填充) •margin与pad ...

  9. 洛谷P1290欧几里德游戏

    题目地址 题目大意: 两个人st和ol博弈 有两个整数n,m 每次轮到一个人时候,需要选择用大的那个数减去小的那个数的倍数(不能减为负数) 最后得到0的为胜利者 思路: (以下讨论均在n<m的条 ...

  10. exec 跟 source 差在哪?-- Shell十三问<第六问>

    exec 跟 source 差在哪?-- Shell十三问<第六问> 这次先让我们从 CU Shell 版的一个实例贴子来谈起吧: 例中的提问是: cd /etc/aa/bb/cc 可以执 ...