6.3 ASP.NET Core Web API技术选择

简介: ASP.NET Core Web API技术选择

6.3 ASP.NET Core Web API技术选择

控制器父类

Controller继承自ControllerBase,只不过增加了视图相关的方法,一般mvc项目选用Controller而Web API项目选择ControllerBase即可。

操作方法的返回值和状态码

ASP.NET Core Web API中的操作方法返回值如果是普通数据类型,则返回值默认被序列化为JSON格式的响应报文体返回。

ASP.NET Core Web API也支持IActionResult<T>类型

   [Route("api/[controller]/[action]")]

   [ApiController]

   publicclassTestController : ControllerBase

   {

       [HttpGet("{id}")]

       publicActionResult<Person>GetPerson(intid)

       {

           if (id<=0)

           {

               returnBadRequest("id必须是正数");//继承自ACtionResult

           }

           elseif (id==1)

           {

               returnnewPerson(1, "tom", 18);

           }

           elseif (id==2)

           {

               returnnewPerson(2, "Zack", 8);

           }

           else

           {

               returnNotFound("人员不存在");//继承自ACtionResult

           }

       }

   }

对于失败的请求,一般要统一响应报文体的格式以便在客户端进行处理。

public record ErrorInfo(int Code, string? Message);声明一个表示错误的详细信息类

其中code参数表示错误的自定义业务代码

//使用ErrorInfo改造GetPerson方法

[HttpGet("{id}")]

publicActionResult<Person>GetPerson(intid)

{

   if (id<=0)

   {

       returnBadRequest(newErrorInfo(1,"id必须是正数"));

   }

   elseif (id==1)

   {

       returnnewPerson(1, "tom", 18);

   }

   elseif (id==2)

   {

       returnnewPerson(2, "Zack", 8);

   }

   else

   {

       returnNotFound(newErrorInfo(2,"人员不存在"));

   }

}

//使用BadRequest或者NotFound等可以使得错误码不一致,供开发人员调试

id 返回结果
-1

||  2   | ||  9   |  |

操作方法的参数

给服务器传递参数的时候,有URL、QueryString、请求报文体3种方式

  • 访问路径中的值
    可以在[HttpGet]、[HttpPost]等中使用占位符{}来捕捉路径中的内容。案例:

请求路径/Student/GetAll/school/MIT/class/A001

GetAll方法添加了[HttpGet("schllo/{schoolName}/class/{classNo}")]

结果:schoolName=MIT和classNo=A001。如果GetAll方法的参数中有和占位符名字同名的参数,那么这个参数就会被自动赋值。如果占位符名字与参数名称不一致,则使用[FromRoute]的Name属性来设置匹配的占位符的名字,例如:

[HttpGet("schllo/{schoolName}/class/{classNo}")]

publicActionResult<Student[]>GetAll(stringschoolName,[FromRoute(Name="classNo")]stringcalssNum) //classNum的参数想获得占位符{classNo}的值

  • QueryString中的值

使用[FromQuery]来获取,如果操作方法的参数名字和QueryString的名字一致,只需要为参数添加[FromQuery],否则,就要设定[FromQuery]的name属性指定名字

//URL的QueryString为pageNum=8&pSize=10

publicActionResult<Student[]>GetAll([FromQuery]stringpageNum,[FromQuery)(Name="psize")]intpageSize)

  • 混合使用

//可以处理/Student/GetAll/school/MIT/class/A001?pageNum=8&pSize=10

[HttpGet("schllo/{schoolName}/class/{classNo}")]

publicActionResult<Student[]>GetAll(stringschoolName,[FromRoute(Name="classNo")]stringcalssNum,[FromQuery]stringpageNum,[FromQuery)(Name="psize")]intpageSize)

  • 请求报文体

目前JSON是主流的请求报文体格式,本文讲JSON报文体

案例:

需求:前端浏览器向服务器发送的报文体:{"name":"qs","age":"18"}

直接声明一个Person类定义Name和age两个属性

[HttpPost]

publicActionResultAddNew(Personp)

客户端只要向/Person/AddNew提交Post提交即可

也可以从URL中获取参数、从请求报文体获取数据混合使用

[HttpPost("classId/{classId}")]

publicActionResult<long>AddNew(longclassId,Persons)

//客户端只要向/Students/AddNew/classId/8,伴随报文体{“name”:"yzk","age":"18"}

//通过classId获取8,s参数则是报文体

注意:一定设置请求报文头中Content-Type为application/JSON

案例

publicrecordProcessInfo(intId,stringProcessName,longWorkingSet64);

publicrecordLoginResult(boolisok, ProcessInfo[]?Process);

publicrecordLoginRequeset(stringusername,stringpassword);

//Login方法用来判断请求的用户名、密码是否正确,如果正确的话服务器会返回当前计算机的所有进程信息

[Route("api/[controller]/[action]")]

[ApiController]

publicclassLoginController : ControllerBase

{

   [HttpPost]

   publicActionResult<LoginResult>Login(LoginRequesetloginreq)

   {

       if (loginreq.username=="admin"&&loginreq.password=="123456")

       {

           varprocess=Process.GetProcesses().Select(p=>newProcessInfo(p.Id, p.ProcessName, p.WorkingSet64)).ToArray();

           returnnewLoginResult(true, process);

       }

       else

       {

           returnnewLoginResult(false, null);

       }

   }

}

前端页面

<!DOCTYPE html>

<html>

<head>

   <metacharset="utf-8"/>

   <title>dddd</title>

</head>

<body>

   <divid="app">

       <div>

           <label>账户:</label>

           <inputtype="text"placeholder="账户"v-model="acount"/>

           <label>账户:</label>

           <inputtype="password"placeholder="密码"v-model="password"/>

           <button@click="queryprocess">

               搜 索

           </button>

       </div>

       <div>

           <ul>

           <liv-for="(process,index) in processarr">

              id: {{process.id}} == processName: {{process.processName}} == workingSet64: {{process.workingSet64}}

           </li>

           </ul>

       </div>

   </div>

   <scriptsrc="./vue.js"></script>

   <scriptsrc="./axios.min.js"></script>

   <script>

       varapp=newVue({

           el: "#app",

           data: {

               processarr: [],

               acount: "",

               password: ""

           },

           methods: {

               queryprocess() {

                   varthat=this;

                   axios.post("http://localhost:7285/api/Login/Login", {

                       username: this.acount,

                       password: this.password

                   }).then(res=> {

                       if(!res.data.isok)

                       {

                           alert("账户密码错误!");

                           return;

                       }

                       that.processarr=res.data.process;

                       console.log(res);

                   }, err=> { alert("访问出错");});

               },

           }

       });

   </script>

</body>

</html>

启动服务后,发现浏览器没有反应,这是因为前端和后端不在同一个域名下(不同的端口也认为是不同的域名),浏览器默认是禁止AJAX跨域。我们可以采用CORS方式,CORS是浏览器中标准的跨域通信方式。CORS的原理是在服务器的响应报文头文件中通过access-control-allow-origin告诉浏览器允许跨域访问的域名。

我们需要在后端项目中启用CORS,并且设定前端项目的域名。

//在项目Program.cs中的var app = builder.Build();前面加上

string[] urls=new[] { "http://127.0.0.1:5500" };//允许跨域访问的域名

builder.Services.AddCors(options=>

   options.AddDefaultPolicy(builder=>builder.WithOrigins(urls)

   .AllowAnyMethod().AllowAnyHeader().AllowCredentials()));

//最后在app.UseHttpsRedirection();前面加上app.UseCors();

相关实践学习
基于函数计算快速搭建Hexo博客系统
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
4天前
|
XML 开发框架 .NET
C#/ASP.NET应用程序配置文件app.config/web.config的增、删、改操作
C#/ASP.NET应用程序配置文件app.config/web.config的增、删、改操作
|
13天前
|
缓存 前端开发 搜索推荐
【Flutter前端技术开发专栏】Flutter中的自定义绘制与Canvas API
【4月更文挑战第30天】Flutter允许开发者通过`CustomPaint`和`CustomPainter`进行自定义绘制,以实现丰富视觉效果。`CustomPaint` widget将`CustomPainter`应用到画布,而`CustomPainter`需实现`paint`和`shouldRepaint`方法。`paint`用于绘制图形,如示例中创建的`MyCirclePainter`绘制蓝色圆圈。Canvas API提供绘制形状、路径、文本和图片等功能。注意性能优化,避免不必要的重绘和利用缓存提升效率。自定义绘制让Flutter UI更具灵活性和个性化,但也需要图形学知识和性能意识。
【Flutter前端技术开发专栏】Flutter中的自定义绘制与Canvas API
|
14天前
|
人工智能 开发框架 量子技术
【专栏】.NET 技术:驱动创新的力量
【4月更文挑战第29天】.NET技术,作为微软的开发框架,以其跨平台、开源和语言多样性驱动软件创新。它在云计算、AI/ML、混合现实等领域发挥关键作用,通过Azure、ML.NET等工具促进新兴技术发展。未来,.NET将涉足量子计算、微服务和无服务器计算,持续拓宽软件开发边界,成为创新的重要推动力。掌握.NET技术,对于开发者而言,意味着握有开启创新的钥匙。
|
14天前
|
开发框架 .NET C#
【专栏】理解.NET 技术,提升开发水平
【4月更文挑战第29天】本文介绍了.NET技术的核心概念和应用,包括其跨平台能力、性能优化、现代编程语言支持及Web开发等特性。文章强调了深入学习.NET技术、关注社区动态、实践经验及学习现代编程理念对提升开发水平的重要性。通过这些,开发者能更好地利用.NET构建高效、可维护的多平台应用。
|
14天前
|
机器学习/深度学习 vr&ar 开发者
【专栏】.NET 技术:引领开发新方向
【4月更文挑战第29天】本文探讨了.NET技术如何引领软件开发新方向,主要体现在三方面:1) 作为跨平台开发的先锋,.NET Core支持多操作系统和移动设备,借助.NET MAUI创建统一UI,适应物联网需求;2) 提升性能和开发者生产力,采用先进技术和优化策略,同时更新C#语言特性,提高代码效率和可维护性;3) 支持现代化应用架构,包括微服务、容器化,集成Kubernetes和ASP.NET Core,保障安全性。此外,.NET还不断探索AI、ML和AR/VR技术,为软件开发带来更多创新可能。
|
14天前
|
开发框架 Cloud Native 开发者
【专栏】剖析.NET 技术的核心竞争力
【4月更文挑战第29天】本文探讨了.NET框架在软件开发中的核心竞争力:1) .NET Core实现跨平台与云原生技术的融合,支持多操作系统和容器化;2) 提升性能和开发者生产力,采用JIT、AOT优化,提供C#新特性和Roslyn编译器平台;3) 支持现代化应用架构,包括微服务和容器化,内置安全机制;4) 丰富的生态系统和社区支持,拥有庞大的开发者社区和微软的持续投入。这些优势使.NET在竞争激烈的市场中保持领先地位。
|
14天前
|
开发框架 .NET 开发者
【专栏】领略.NET 技术的创新力量
【4月更文挑战第29天】.NET技术自ASP.NET起历经创新,现以.NET Core为核心,展现跨平台能力,提升性能与生产力,支持现代化应用架构。.NET Core使开发者能用同一代码库在不同操作系统上构建应用,扩展至移动和物联网领域。性能提升,C#新特性简化编程,Roslyn编译器优化代码。拥抱微服务、容器化,内置安全机制,支持OAuth等标准。未来.NET 6将引入更快性能、Hot Reload等功能,预示着.NET将持续引领软件开发潮流,为开发者创造更多机会。
|
14天前
|
物联网 vr&ar 开发者
【专栏】.NET 技术:为开发注入活力
【4月更文挑战第29天】本文探讨了.NET技术的创新,主要体现在三个方面:1) .NET Core实现跨平台开发革命,支持多种操作系统和硬件,如.NET MAUI用于多平台UI;2) 性能提升与生产力飞跃,C#新特性简化编程,JIT和AOT优化提升性能,Roslyn提供代码分析工具;3) 引领现代化应用架构,支持微服务、容器化,内置安全机制。未来,.NET 7将带来更多新特性和前沿技术整合,如量子计算、AI,持续推动软件开发创新。开发者掌握.NET技术将赢得竞争优势。
|
14天前
|
人工智能 前端开发 Cloud Native
【专栏】洞察.NET 技术的开发趋势
【4月更文挑战第29天】本文探讨了.NET技术的三大发展趋势:1) 跨平台与云原生技术融合,通过.NET Core支持轻量级、高性能应用,适应云计算和微服务;2) 人工智能与机器学习的集成,如ML.NET框架,使开发者能用C#构建AI模型;3) 引入现代化前端开发技术,如Blazor,实现前后端一致性。随着.NET 8等新版本的发布,期待更多创新技术如量子计算、AR/VR的融合,.NET将持续推动软件开发的创新与进步。
|
14天前
|
人工智能 前端开发 Devops
【专栏】洞察.NET 技术在现代开发中的作用
【4月更文挑战第29天】本文探讨了.NET技术在现代软件开发中的核心价值、应用及挑战。.NET提供语言统一性与多样性,强大的Visual Studio工具,丰富的类库,跨平台能力及活跃的开发者社区。实际应用包括企业级应用、Web、移动、云服务和游戏开发。未来面临性能优化、容器化、AI集成等挑战,需持续创新。开发者应深入理解.NET,把握技术趋势,参与社区,共创美好未来。