WebAPI(一)

WebAPI

实行Restful路由风格

API数据处理

WebApi.net6.0学习

路由规则和路由传参

Route的api/[controller]/[action]路由匹配

如果需要区分路由,可以在路由获取方式上添加相应的字段


路由传参的几种方式

​ 1. 定义接收端口,但是值可传可不传


​ 2.必须传值(必传项),并且定义的参数必须一一对应


否者会出现伪静态路由,不过应该不算报错

多参数传参,并且是必传项

ApiControllerAttribute

  1. 标记控制器:任何需要成为 Web API 控制器的类都应该用 ApiControllerAttribute 进行标记。例如:

    [ApiController]
    public class ProductsController : ControllerBase
    {
        // 动作方法
        public IEnumerable<Product> Get()
        {
            // ...
        }
    }
    
  2. 配置特性ApiControllerAttribute 提供了一些配置选项,允许你定义控制器的特定行为,如格式化设置、HTTP状态码处理等。

  3. 自动模型验证:当控制器用 ApiControllerAttribute 标记后,Web API 会自动执行传入请求的模型验证。如果模型验证失败,它将自动返回一个 HTTP 400(错误请求)响应。

  4. 属性路由:在 ASP.NET Web API 2 中,ApiControllerAttribute 支持属性路由(attribute routing),这是一种更灵活的路由方式,允许你直接在控制器和动作上定义路由。

  5. 继承ApiControllerAttribute 继承自 ControllerBase,这意味着任何继承自 ControllerBase 的特性或方法也适用于标记了 ApiControllerAttribute 的控制器。

  6. 非阻塞性:从 ASP.NET Core 开始,ApiControllerAttribute 确保控制器动作是非阻塞的,这意味着它们不应该直接同步等待 I/O 操作完成。

  7. 响应类型:通常,控制器动作返回 IActionResult 或其派生类型,这允许 Web API 框架将动作的结果封装为适当的 HTTP 响应。

  8. 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中启用了

enable

编译器会自动隐式增加对于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请求,然
后通过报文体来传递参数。
  1. 使用RPC风格:Users/AddNew、Users/GetAll、Users/DeleteByld。
  2. 对于可以缓存的操作,使用GET请求;对于幂等的更新操作,使用
    PUT请求;对于幂等的删除操作,使用DELETE请求;对于其他操作,统
    一使用POST请求。
  3. 参数:保存、更新类的请求使用POST、PUT请求,把全部参数都放到
    请求报文体中;对于GET和DELETE请求,把参数放到QueryString中。推荐尽量使用URL做资源定位。
  4. 对于业务错误,服务器端返回合适的4XX状态码,不知道该选择哪个
    状态码就用400;同时,在报文体中通过code参数提供业务错误码以及错误消息。
  5. 如果请求的处理执行成功,服务器端返回值为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()之前
但是如果浏览器不支持缓存,那么服务器端即使设置也不会使用缓存
posted @   想要来杯咖啡吗  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示