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();

相关文章
|
22天前
|
中间件 Go
Golang | Gin:net/http与Gin启动web服务的简单比较
总的来说,`net/http`和 `Gin`都是优秀的库,它们各有优缺点。你应该根据你的需求和经验来选择最适合你的工具。希望这个比较可以帮助你做出决策。
65 35
|
1月前
|
人工智能 搜索推荐 IDE
突破网页数据集获取难题:Web Unlocker API 助力 AI 训练与微调数据集全方位解决方案
本文介绍了Web Unlocker API、Web-Scraper和SERP API三大工具,助力解决AI训练与微调数据集获取难题。Web Unlocker API通过智能代理和CAPTCHA绕过技术,高效解锁高防护网站数据;Web-Scraper支持动态内容加载,精准抓取复杂网页信息;SERP API专注搜索引擎结果页数据抓取,适用于SEO分析与市场研究。这些工具大幅降低数据获取成本,提供合规保障,特别适合中小企业使用。粉丝专属体验入口提供2刀额度,助您轻松上手!
60 2
|
1月前
|
人工智能 运维 安全
网络安全公司推荐:F5荣膺IDC全球Web应用与API防护领导者
网络安全公司推荐:F5荣膺IDC全球Web应用与API防护领导者
53 3
|
2月前
|
XML JSON API
Understanding RESTful API and Web Services: Key Differences and Use Cases
在现代软件开发中,RESTful API和Web服务均用于实现系统间通信,但各有特点。RESTful API遵循REST原则,主要使用HTTP/HTTPS协议,数据格式多为JSON或XML,适用于无状态通信;而Web服务包括SOAP和REST,常用于基于网络的API,采用标准化方法如WSDL或OpenAPI。理解两者区别有助于选择适合应用需求的解决方案,构建高效、可扩展的应用程序。
|
2月前
|
机器学习/深度学习 开发框架 API
Python 高级编程与实战:深入理解 Web 开发与 API 设计
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化、调试技巧以及数据科学和机器学习。本文将深入探讨 Python 在 Web 开发和 API 设计中的应用,并通过实战项目帮助你掌握这些技术。
|
5月前
|
人工智能 搜索推荐 API
自学记录鸿蒙API 13:实现人脸比对Core Vision Face Comparator
在完成文本识别和人脸检测项目后,我深入学习了HarmonyOS Next API 13中的Core Vision Face Comparator API,开发了一个简单的人脸比对工具。该API能进行高精度人脸比对并给出相似度评分,应用场景广泛,如照片分类、身份认证、个性化服务等。通过初始化服务、加载图片、实现比对功能和构建用户界面,最终实现了可靠的人脸比对功能。未来计划将此技术应用于更复杂的场景,如照片管理和个性化服务,并探索与其他AI能力的结合。如果你也对人脸比对感兴趣,不妨从简单的比对功能开始,逐步实现自己的创意!
165 61
|
5月前
|
运维 前端开发 C#
一套以用户体验出发的.NET8 Web开源框架
一套以用户体验出发的.NET8 Web开源框架
142 7
一套以用户体验出发的.NET8 Web开源框架
|
4月前
|
开发框架 数据可视化 .NET
.NET 中管理 Web API 文档的两种方式
.NET 中管理 Web API 文档的两种方式
79 14
|
5月前
|
人工智能 自然语言处理 文字识别
自学记录鸿蒙API 13:实现智能文本识别Core Vision Text Recognition
在完成语音助手项目后,我尝试了HarmonyOS Next API 13中的Core Vision Text Recognition API,体验其强大的文本识别功能。该API支持多语言高精度识别,能快速将图像中的文本提取为结构化信息,适用于文档扫描、票据管理和实时翻译等场景。通过权限配置、初始化服务、实现识别功能和构建用户界面,我完成了文本识别应用的开发,并探索了性能优化与功能扩展。鸿蒙生态的强大支持让开发者能更便捷地实现复杂功能。未来计划将此技术应用于实际项目,如票据管理或实时翻译工具。如果你也对文本识别感兴趣,不妨一起探索!
122 11
|
5月前
|
人工智能 监控 安全
自学记录鸿蒙 API 13:骨骼点检测应用Core Vision Skeleton Detection
骨骼点检测技术能够从图片中识别出人体的关键骨骼点位置,如头部、肩部、手肘等,广泛应用于运动健身指导、游戏交互、医疗辅助、安全监控等领域。我决定深入学习HarmonyOS Next API 13中的Skeleton Detection API,并开发一个简单的骨骼点检测应用。通过理解API核心功能、项目初始化与配置、实现检测功能、构建用户界面,以及性能优化和功能扩展,逐步实现这一技术的应用。未来计划将其应用于健身指导和智能监控领域,探索与其他AI能力的结合,开发更智能的解决方案。如果你也对骨骼点检测感兴趣,不妨一起进步!
231 9