愛在花開的季節 发表于 2024-7-13 12:15:32

Asp.NET Core WebAPI 入门学习条记,超具体

1.WebAPI概述

1.1 WebAPI

WebAPI 是一种传统的方式,用于构建和袒露 RESTUI风格的Web服务。它提供了丰富的功能和机动性,可以处理各种HTTP哀求,并支持各种数据格式,如JSON、XML等。
WebAPI利用控制器(Controllers)和动作方法(ActionMethods)的概念、通过路由配置将哀求映射到相应的方法上。
开发人员可以利用各种属性和过滤器来处理哀求、控制访问权限、验证数据等。
1.2 MinimaIAPI

MinimaIAPI 是ASP.NET COre6引入的一种新的轻量级 API开发模型。
它旨在简化 API的创建过程,提供更简洁、更集中的代码结构。
MinimalAP1基于函数式编程模型,通过一个顶级的webAppiication 类来配置路由和哀求处理。开发人员可以利用链式调用的方式定义路由、哀求处理逻辑和中心件。这种模型更加直观和易于理解,尤其得当构建小型的、单一用途的 WebAPI。
与WebAPI相比,MinimalAPI的重要区别包括:


[*]1.代码量更少:MinimalAPI基于函数式编程模型,代码更加简洁、消除了控制器和动作方法的概念。
[*]2.更少的依赖项:MinimalAPI不需要利用额外的NuGet包,只需利用ASP.NET Core 本身的核心包即可。
[*]3.更直观的路由配置:MinimaAP1利用链式调用的方式定义路由,路由配置更加直观和易于理解。
[*]4.更轻量级的应用:由于代码量少、依赖项少,MinimalAPI应用程序的启动时间更快,内存占用更小。
2.新建WebAPI

Web API项目模板提供了一个入门版控制器:

")]
public class WeatherForecastController : ControllerBase
Web API控制器通常应派生自 ControllerBase 而不是 Controler。Controller派生自ControlerBase,并添加对视图的支持,因此它用于处理 Web页面,而不是WebAPI哀求。如果同一控制器必须支持视图和 Web API,则派生自Controller.
https://img-blog.csdnimg.cn/direct/d1f5f5bf07994fc1b8ceafcdf3df6d38.png
https://img-blog.csdnimg.cn/direct/0376549f2ed94075b51aa7216cf5e936.png

https://img-blog.csdnimg.cn/direct/c8bf841f47cc45409c19436881242125.png
https://img-blog.csdnimg.cn/direct/9927e31da2e74959ad5a93716d3693e9.png

https://img-blog.csdnimg.cn/direct/ba016494fba0455cb27b084bc3e2c748.png

写一个简洁的API,我们新建一个控制器VauleController:
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace WebAPI.Controllers
{
    /")]
   
    public class ValuesController : ControllerBase
    {
      
      public string Test()
      {
            return "ok";
      }
    }
}  在浏览器上访问:
https://img-blog.csdnimg.cn/direct/95469ff1feaa4e4283d8aca59ca6ec17.png
通过在浏览器上输入api// 从而调用接口,如下图所示接口可用。
https://img-blog.csdnimg.cn/direct/6c476fd33f064421861e1d13d332dc66.png
3.绑定源参数推理

下面内容了解为主,绑定源特性定义可找到操纵参数值的位置。存在以下绑定源特性:
https://img-blog.csdnimg.cn/direct/75461f2ca2174429bf85ce618fd19f87.png


[*]属性将推理规则应用于操纵参数的默认数据源。借助这些规则,无需通过将属性应用于操纵参数来手动辨认绑定源。绑定源推理规则的行为如下:
[*]针对在 DI容器中注册的复杂范例参数举行推断。
[*]不适用于具有特别寄义的任何复杂
[*]的内置范例,如IFormCollection和CancellationToken。绑定源推理代码将忽略这些特别范例。
[*]针对IFormFile和IFormFileCollection范例的操纵参数举行推断。该特性不针对任何简单范例或用户定义范例举行推断。
[*]针对与路由模板中的参数相匹配的任何操纵参数名称举行推断。当多个路由与一个操纵参数匹配时,任何路由值都视为。
[*]针对任何其他操纵参数举行推断 。
4.设置Json格式之大小写

https://img-blog.csdnimg.cn/direct/25dcd89b82334bb4b5602cb86efd857a.png

ValuesController修改后:
namespace WebAPI.Controllers
{
    /")]
   
    public class ValuesController : ControllerBase
    {
      
      public string Test()
      {
            return "ok";
      }
      
      public List<TestModel> Get()
      {
            List<TestModel> list = new List<TestModel>() { };
            list.Add(new TestModel(){ Id=1,Name="张三", Description="描述",Time=DateTime.Now });
            list.Add(new TestModel() { Id = 2, Name = "李四", Description = "描述", Time = DateTime.Now });
            return list;
      }
    }
} https://img-blog.csdnimg.cn/direct/1c2d8186a3444382a77dd0504810f2d1.png

https://img-blog.csdnimg.cn/direct/c260572efb914e91bb4f9eed459b87fd.png

https://img-blog.csdnimg.cn/direct/3fda59d5cc9c4c73b5f330e6db34ce56.png

解决:安装 Microsoft,AspNetCore.Mvc,Newtonsoftjson 7.0.7 
https://img-blog.csdnimg.cn/direct/544ee24dcffc45ff917308f5a363fb77.png

在 Program.cs 文件 添加JSON的配置服务
https://img-blog.csdnimg.cn/direct/7ccb8ee98dba4f1990f1be98f0bc1362.png
https://img-blog.csdnimg.cn/direct/279d3df0fe20436d9fa6665c195e389e.png
5.设置Json格式之日期格式化

https://img-blog.csdnimg.cn/direct/0a0b54e04dbe4bcfb2b7fd1bacc8ed9e.png
上诉图片返回的时间不是我们常见的 “年代份时分秒”的格式,故用户一样平常都看不懂,这样的日期格式给用户的体验较差。
鸠拙的方法
将ValuesController返回Get 中的日期改成常见的 “yyyy-MM-dd HH:mm:ss”,此方法缺点是List的数目越多,修改越麻烦。
统一设置API的日期格式
    //统一设置API的日期格式
    options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; https://img-blog.csdnimg.cn/direct/6704745ee8954de5bbc885eaa2be89d3.png
https://img-blog.csdnimg.cn/direct/7a4c7bc0526a4b08bb43f3b16fdc3e81.png
6.通过范例设置参数默认值

默认情况下,哀求的字符串参数不为空如下图所示,我们可以定义一个过滤器将哀求的字符串参数设置为空。
https://img-blog.csdnimg.cn/direct/74487053e275468488f7554bae175fa8.png
Swagger 配置
(1)添加查询实体
namespace WebAPI.Model
{
    /// <summary>
    /// 查询实体
    /// </summary>
    public class SearchReq
    {
      public string Name { get; set; }
      public string Description { get; set; }
      public int PageIndex { get; set; }
      public int PageSize { get; set; }
    }
} (2) 调用的方法
https://img-blog.csdnimg.cn/direct/fce9afef644f45b09dd549972c1f2535.png
(3) 创建Config,并创建过滤器。
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;

namespace WebAPI.Config
{
    // 定义过滤器
    public class DefaultValueSchemaFilter : ISchemaFilter
    {
      public void Apply(OpenApiSchema schema, SchemaFilterContext context)
      {
            // 判断获取的对象是否为空
            if (schema == null)
            {
                return;
            }

            var objectSchema = schema;
            // 遍历每一个属性
            foreach (var property in objectSchema.Properties) {
                // 判断如果数据类型为字符串,且默认为空
                if (property.Value.Type == "string" && property.Value.Default == null)
                {
                  property.Value.Default = new OpenApiString("");
                }
            }
      }
    }
} (3)配置过滤器。
builder.Services.AddSwaggerGen(option =>{
    // 设置对象类型参数默认追
    option.SchemaFilter<DefaultValueSchemaFilter>();// 配置过滤器
}); 运行并哀求 ValuesController 控制器的 Test 方法。
https://img-blog.csdnimg.cn/direct/5143ee14d006423b8e4bd74aaca099a2.png

7.通过属性名设置参数默认值

如何根据字段名制定数值,比如设置PageIndex 和PageSize 数值,这样就不消担心默认查询时需要手动输出的麻烦(不消手动修改默认值)。
https://img-blog.csdnimg.cn/direct/fd96fd3c6ee84c30984b7721759710f6.png

8.通过特性设置参数默认值

如果有很多字段要设置默认值,在上述的过滤器设置默认值显得很繁琐,为了解决这个题目,可以通过特性设置参数默认值。
(1) 在过滤器添加
// 通过特性来实现
DefaultValueAttribute defaultAttribute = context.ParameterInfo?.GetCustomAttribute<DefaultValueAttribute>();
if (defaultAttribute != null)
{
    property.Value.Example = (IOpenApiAny)defaultAttribute.Value;
} (2) SearchReq
设置默认值
https://img-blog.csdnimg.cn/direct/6ddfd50ea0df410e8847086a27374bf2.png
通过特性设置参数默认值,后面的默认值可以直接在SearchReq字段上设置。
下图是查询时,参数的默认值。
https://img-blog.csdnimg.cn/direct/f3b869e4236a4272a6402f3ad8db1091.png 
9.序列化和反序列化

手动序列化对象:
(1). 引入命令空间 
using System.Text.Json (2) 把一个对象序列化成一个字符串
      
      public string Test()
      {
            List<TestModel> list = new List<TestModel>() { };
            list.Add(new TestModel() { Id = 1, Name = "张三", Description = "描述", Time = DateTime.Now });
            list.Add(new TestModel() { Id = 2, Name = "李四", Description = "描述", Time = DateTime.Now });
            // 手动序列化
            return JsonSerializer.Serialize(list); // 把一个对象序列化成一个字符串
      } (3) 哀求时返回一个json字符串 
https://img-blog.csdnimg.cn/direct/e23e8f8f81b44824abfd70b97ed0f8f7.png
反序列化:
            List<TestModel> list = new List<TestModel>() { };
            list.Add(new TestModel() { Id = 1, Name = "张三", Description = "描述", Time = DateTime.Now });
            list.Add(new TestModel() { Id = 2, Name = "李四", Description = "描述", Time = DateTime.Now });
            // 反序列化成一个对象
            string str = JsonSerializer.Serialize(list);
            var list2=JsonSerializer.Deserialize<List<Tesplodel>>(str): 10.跨域题目分析


跨域题目(Cross-Origin Resource Sharing,简称CORS)是由浏览器的同源策略(Same-Origin Policy)引起的。
同源策略是一种安全机制,限制了一个网页从差异源加载的资源与当前页面举行交互。同源是指两个页面的协议、域名和端标语都雷同。
https://img-blog.csdnimg.cn/direct/790e029fec384f608dec6c46507961bb.png
当一个网页实验从差异的域名、端口或协议加载资源时,浏览器会根据同源策略阻止这种跨域资源访问。例如,如果一个网页在域名A上加载的]avaScript代码试图向域名B发送Ajax哀求,浏览器会阻止这个跨域哀求。
跨域题目的产生是因为现代Web应用程序通常采用前后端分离架构,前端代码通常运行在浏览器中,而后端代码则运行在差异的服务器上。为了掩护用户数据安全和防止恶意攻击,浏览器引入了同源策略,限制了跨域资源的访问。
跨域题目可以通过跨域资源共享(CORS)机制来解决。CORS是一种机制,允许服务器在相应中添加一些特定的HTTP头部,告诉浏览器允许跨域访问资源。通过在服务器端配置相应头,可以允许特定的域名或所有域名跨域访问资源。
通常情况下,服务器端需要设置以下HTTP头部来启用CORS:


[*]1.Access-Control-Allow-Origin:指定允许访问资源的域名,可以是具体的域名或通配符(如*)表示允许所有域名访问。
[*]2.Access-Control-Allow-Methods:指定允许的HTTP哀求方法,如GET、POST等。
[*]3.Access-Control-Allow-Headers:指定允许的自定义HTTP哀求头部。
[*]4.Access-Control-Allow-Credentials:指定是否允许发送根据(如Cookie、HTTP认证)。
通过设置这些HTTP头部,服务器可以告知浏览器允许跨域访问资源,从而解决跨域题目。
需要注意的是,CORS只是一种浏览器机制、对于其他非浏览器情况,如服务器之间的哀求,不受同源策略的限制。
11.跨域题目处理

// 添加跨域策略
//添加跨域策略
builder.Services.AddCors(options =>
{
    // 策略名称 (允许所有的来源,允许所有请求头,允许所有的方法)
    options.AddPolicy("CorsPolicy", opt => opt.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod());
    // 如果需要单独处理跨域的地址,可以通过AllowAnyOrigin,AllowAnyHeader,AllowAnyMethod 进一步配置
});
// 利用跨域策略
// 使用跨域策略
app.UseCors("CorsPolicy");   发生跨域时、哀求是经过了后端的返回数据以后,被浏览器拦截了,不给客户端。

12.发起HttpGet哀求

很多时间都是别人来哀求我们的API,但是也有一些时间,是我们在自身WebAPI大概MVC里面调用别人写好的API,那么如何做呢?下面以两个例子来阐明。
前置条件
https://img-blog.csdnimg.cn/direct/408f3f7a6d3846e6a2d021e6f476f81c.png
https://img-blog.csdnimg.cn/direct/0d6c55ac2faa496f820c6b1597159006.png

13.发起HttpPost哀求

app.MapGet("post",async(IHttpClientFactory httpclientFactory)>
RequestModel reg=new RequestModel();
req.userName = "admin";
reg.passWord=“123456";
// 包装参数
var regdson = new stringContent(
JsonSerializer.Serialize(reg)
Encoding .UTF8,
Application.Json //using static System.Net.Mime.MediaTypeNames;
var httpClient = httpClientFactory.CreateClient();
using var httpResponseMessageawaithttpClient,PostAsync("http://localhost:5201/api/ogin/GetToken",reqJson);var readStr=await httpResponseMessage.Content.ReadAsStringAsync();return readstr;
}); 案例代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Asp.NET Core WebAPI 入门学习条记,超具体