WebAPI(一)
WebAPI
实行Restful路由风格
API数据处理
WebApi.net6.0学习
路由规则和路由传参
Route的api/[controller]/[action]路由匹配
如果需要区分路由,可以在路由获取方式上添加相应的字段
路由传参的几种方式
1. 定义接收端口,但是值可传可不传
2.必须传值(必传项),并且定义的参数必须一一对应
否者会出现伪静态路由,不过应该不算报错
多参数传参,并且是必传项
ApiControllerAttribute
-
标记控制器:任何需要成为 Web API 控制器的类都应该用
ApiControllerAttribute
进行标记。例如:[ApiController] public class ProductsController : ControllerBase { // 动作方法 public IEnumerable<Product> Get() { // ... } }
-
配置特性:
ApiControllerAttribute
提供了一些配置选项,允许你定义控制器的特定行为,如格式化设置、HTTP状态码处理等。 -
自动模型验证:当控制器用
ApiControllerAttribute
标记后,Web API 会自动执行传入请求的模型验证。如果模型验证失败,它将自动返回一个 HTTP 400(错误请求)响应。 -
属性路由:在 ASP.NET Web API 2 中,
ApiControllerAttribute
支持属性路由(attribute routing),这是一种更灵活的路由方式,允许你直接在控制器和动作上定义路由。 -
继承:
ApiControllerAttribute
继承自ControllerBase
,这意味着任何继承自ControllerBase
的特性或方法也适用于标记了ApiControllerAttribute
的控制器。 -
非阻塞性:从 ASP.NET Core 开始,
ApiControllerAttribute
确保控制器动作是非阻塞的,这意味着它们不应该直接同步等待 I/O 操作完成。 -
响应类型:通常,控制器动作返回
IActionResult
或其派生类型,这允许 Web API 框架将动作的结果封装为适当的 HTTP 响应。 -
API行为约定:
ApiControllerAttribute
还包含了一些 Web API 的行为约定,比如对 HTTP 405(方法不允许)和 HTTP 406(不接受)的自动处理。
跨域
三步走
builder.Sercices.AddCors(c=>c.AddPolicy("any",p=>
p.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin()));
app.UseCors();
在控制器类上面添加
[EnableCors("any")]
.net6.0
新语法
在using前面加上global关键字,可以使变为全局变量。
如果在csproj中启用了
编译器会自动隐式增加对于System,System.Linq等常用命名空间的引入,不同个类型项目引入的命名空间也不一样。
csproj中
<Nullable>enable</NUllable>启用可空引用类型检
查
在引用类型后添加“ ?”修饰符来声明这个类型是可空的。对于没有添加"?"修饰符的引用类型的变量,如果编译器发现存在为这个变量赋值null的可能性的时候,编译器会给出警告信息。
record类型
C#中的==运算符默认是判断两个变量指向的 是否是同一个对象,即使两个对象内容完全一样,也不相等。可以通过重与Equals万法、重写 == 运算符等来解决这个。
问题,不过需要开发人员编写非常多的额外代码。
2、在C#9.0中增加了记录(record)类型的语法,编译器会为我们自动生成Equals、GetHashcode等方法。
record的所有属性,只读不可写
internal record Student (int Id, string Name)
{
public string NickName { get; set;}
}
-
可以实现部分属性是只读的、而部分属性是可以读
写。
-
默认生成的构造方法的行为不能修改,我们可以为
类型提供多个构造方法,然后其他构造方法通过this调
用默认的构造方法。
-
也推荐使用只读属性的类型。这样的所有属性都为
只读的类型叫做“不可变类型”,可以让程序逻辑简单,
减少并发访问、状态管理等的麻烦。
internal record Student (int Id, string Name) { public string? NickName { get; set; } public Student (int Id, string Name, string nickName) : this (Id, Name) { this. NickName = nickName; } } Student s1=new Student(1,"yzk"); Student s2=new Student(1,"yzk","xiaokeke");
ASP.NET CORE
REST
按照HTTP的语义来使用HTTP的协议
统一资源定位符(URL,英语Uniform Resource Locator的缩写)
编程规范
对于保存、更新类的请求POST、PUT请求,把全部参数都放到请求报
文体中;
对于DELETE请求,要传递的参数就是一个资源的id,因此把参数放到
QueryString中即可;
对于GET请求,一般参数的内容都不会太长,因此统一通过
QueryString传递参数就可以。对于极少数参数内容超过URL限制的请求,
由于GET、PUT请求都是幂等的,因此我们把请求改成通过PUT请求,然
后通过报文体来传递参数。
- 使用RPC风格:Users/AddNew、Users/GetAll、Users/DeleteByld。
- 对于可以缓存的操作,使用GET请求;对于幂等的更新操作,使用
PUT请求;对于幂等的删除操作,使用DELETE请求;对于其他操作,统
一使用POST请求。 - 参数:保存、更新类的请求使用POST、PUT请求,把全部参数都放到
请求报文体中;对于GET和DELETE请求,把参数放到QueryString中。推荐尽量使用URL做资源定位。 - 对于业务错误,服务器端返回合适的4XX状态码,不知道该选择哪个
状态码就用400;同时,在报文体中通过code参数提供业务错误码以及错误消息。 - 如果请求的处理执行成功,服务器端返回值为200的Http状态码,如
果有需要返回给客户端的数据,则服务器端把这些数据放到响应报文体中。
如果控制器中存在一个没有添加[HttpGet]、[HttpPost]等的public 方法,Swagger就会报错,可以用
[ApiExplorerSettings(IgnoreApi = true)]
控制器及返回值
[HttpGet("students/school/{schoolName}/class/{classNo}")]
public Person GetStudents (string schoolName, [FromRoute (Name="classNo") ]int classNum)
{
return new Person { Id=classNum+6, Name=schoolName+"T"};
}
1、Action方法既可以同步也可以异步。
2、Web API中Action方法的返回值如果是普通数据类型,那么返回值就 会默认被序列化为Json格式。
3、Web API中的Action方法的返回值同样支持IActionResult类型,不包 含类型信息,因此Swagger等无法推断出类型,所以推荐用 ActionResult
public ActionResult<Person> GetPerson(int id)
{
if (id <= 0)
return BadRequest("id必须是正数");
else if (id == 1)
return new Person(1,"杨中科”,18);
else if (id == 2)
return new Person(2, "Zack", 8);
else
return NotFound(“人员不存在”);//自定义消息也重要
}
- 使用[FromQuery]来获取QueryString中的值。如果名字一致,只要为参数添加[FromQuery]即可;而如果名字不一致,
[FromQuery(Name=名字)]。 - QueryString和Route可以混用。
请求
WebAPI的开发模式下,Json格式的请求体是主流。
该显示拿取就从显示拿,该从结构体拿数据及从结构体拿。
如下:
[HttpPut ("{id}")]
public string UpdatePerson1 ([FromRoute]int id, Person p1)
{
return"更新”+id+"成功"+p1.Name;
}
一定要设定请求头中的Content-Type为application/json,而且数据必须是合法的json格式。
WebAPI中很少用到的方式:
- 从Content-Type为Multipart/form-data的请求中获取数据的[FromForm]
- 从请求报文头中获取值的[FromHeader]
前后端分离开发
前端VUE3
Vue搭建步骤:
- 1)安装Node.js
- 2)设定国内镜像 npm config set registry
- https://registry.npm.taobao.org
- 3)安装yarn: npm install-g yarn
- 4)创建Vue项目:yarn create@vitejs/app 项目名字
- 更喜欢用vue-cli 的方式创建项目
- 2024-4 Vue不支持这个写法了,官网是yarn create vite……
- 5)按照提示运行项目。
1、在src文件夹下创建views文件夹。
2、安装ajax库axios,项目根目录:yarn add axios
3、在views文件夹下创建Login.vue文件
<input type="text" v-model="state.loginData.userName" />
<input type="submit"value="登录"
@click="loginSubmit"/>
<tr v-for="p in state.processes" :key="p.id">
<td>{{(p.workingSet64/1024)}}K</td>
</tr>
配置跨域
builder. Services. AddCors (opt => {
opt. AddDefaultPolicy(b => {
b. WithOrigins(new string[] { "http://localhost:3000/" })
. A11owAnyMethod (). A11owAnyHeader (). A11owCredentials();
});
}):
当触发请求时才进行注入的方法
[HttpGet]
public int Test1([FromServices]TestService textService,int x)
{
return textService.Count+x;
}
开发模块化的服务注册框架
在复杂项目中,一个系统不只有一个项目,要分为多个项目进行分层开发。
如果每个项目都需要自己注册自己的服务。
autoFAC
缓存
普通缓存比较鸡肋
客户端响应缓存
在控制器相应的Action上添加
[RespomseCache(Duration=20)]//意为指示浏览器可以缓存20秒
服务器端响应缓存
用法:
在app.MapControllers()之前加上app.UseResponseCaching();
同时要确保app.UseCors()写道app.UseResponseCaching()之前
但是如果浏览器不支持缓存,那么服务器端即使设置也不会使用缓存
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)