6.3 ASP.NET Core Web API技术选择

本文涉及的产品
.cn 域名,1个 12个月
简介: 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();

相关文章
|
23天前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
36 4
|
25天前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
86 3
|
2天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
8 1
|
9天前
|
JSON API 数据格式
如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架
本文介绍了如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架,适合小型项目和微服务。文章从环境准备、创建基本Flask应用、定义资源和路由、请求和响应处理、错误处理等方面进行了详细说明,并提供了示例代码。通过这些步骤,读者可以快速上手构建自己的RESTful API。
20 2
|
19天前
|
监控 负载均衡 API
Web、RESTful API 在微服务中有哪些作用?
在微服务架构中,Web 和 RESTful API 扮演着至关重要的角色。它们帮助实现服务之间的通信、数据交换和系统的可扩展性。
41 2
|
30天前
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
81 9
|
1月前
|
前端开发 JavaScript API
惊呆了!学会AJAX与Fetch API,你的Python Web项目瞬间高大上!
在Web开发领域,AJAX与Fetch API是提升交互体验的关键技术。AJAX(Asynchronous JavaScript and XML)作为异步通信的先驱,通过XMLHttpRequest对象实现了局部页面更新,提升了应用流畅度。Fetch API则以更现代、简洁的方式处理HTTP请求,基于Promises提供了丰富的功能。当与Python Web框架(如Django、Flask)结合时,这两者能显著增强应用的响应速度和用户体验,使项目更加高效、高大上。
47 2
|
1月前
|
前端开发 API 开发者
从零到精通,AJAX与Fetch API让你的Python Web前后端交互无所不能!
从零到精通,AJAX与Fetch API让你的Python Web前后端交互无所不能!
38 3
|
2月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
2月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
87 3