介绍

通过一个简单的项目,总结一下常用的几种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的更多相关文章

  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. python文件处理之fileinput

    一.介绍 fileinput模块可以对一个或多个文件中的内容进行迭代.遍历等操作,我们常用的open函数是对一个文件进行读写操作. fileinput模块的input()函数比open函数更高效和好用 ...

  2. 提高ASP.NET Web应用性能的24种方法和技巧

    那性能问题到底该如何解决?以下是应用系统发布前,作为 .NET 开发人员需要检查的点. 1.debug=「false」 当创建 ASP.NET Web应用程序,默认设置为「true」.开发过程中,设置 ...

  3. 在 .NET Core 中使用 ViewConfig 调试配置

    介绍 .NET Core 中的配置包含了多个配置提供程序,包括了 appsettings.json,环境变量,命令行参数等,还有一些扩展的自定义提供程序,比如说 ApolloConfig,AgileC ...

  4. ECMAScript 2018(ES9)新特性简介

    目录 简介 异步遍历 Rest/Spread操作符和对象构建 Rest Spread 创建和拷贝对象 Spread和bject.assign() 的区别 正则表达式 promise.finally 模 ...

  5. MyBatis-Plus日常工作学习

    一:Mybatis-Plus概述 MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis ...

  6. OOJML系列总结

    目录 0x0 JML理论相关 0.0 概念及作用 0.1 JML语法学习 0x1 使用openJml以及JMLUnitNG 1.0 使用openjml 1.1使用JMLUnitNG 0x2 作业架构设 ...

  7. 2020-BUAA OO-面向对象设计与构造-第三单元总结

    Part-1 JML总结 Section-1 理论基础 The Java Modeling Language (JML) is a behavioral interface specification ...

  8. Elasticsearch核心技术与实战,性能是真牛

    Elasticsearch 是一款非常强大的开源搜索及分析引擎.结合 Kibana.Logstash和Beats,Elasticsearch 还被广泛运用在大数据近实时分析,包括日志分析.指标监控.信 ...

  9. Java 使用 Maven BOM 统一管理版本号

    一个中大型的 Java 项目往往包含若干 JAR 包,这些 JAR 包有着不同的版本号.如果这些 JAR 包单独发布,然后直接通过版本号引用相应的 JAR 包,不同版本的兼容性维护将变得十分麻烦.为了 ...

  10. 【CTF】图片隐写术 · 修复被修改尺寸的PNG图片

    前言 今天我们想来介绍一下关于图片隐写相关处理,以及修复被修改尺寸的PNG图片. 关于PNG图片的相关处理,是CTF Misc图片隐写术中极为基础的一项操作,笔者这里是想要提一些做题过程中发现的小技巧 ...