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

相关文章
|
4月前
|
JSON API 数据格式
亚马逊商品评论API接口技术指南
亚马逊商品评论API可程序化获取指定ASIN商品的用户评价,包含评分、内容、时间等结构化数据。需企业认证并遵守使用协议,日调用上限500次。支持分页与排序查询,适用于竞品分析、口碑监测等场景,结合SP-API可构建完整电商数据方案。(238字)
466 3
|
4月前
|
JSON 缓存 算法
如何通过API获取1688商品类目数据:技术实现指南
1688开放平台提供alibaba.category.get接口,支持获取全量商品类目树。RESTful架构,返回JSON数据,含类目ID、名称、层级等信息。需注册账号、创建应用并授权。请求需签名认证,QPS限10次,建议缓存更新周期≥24小时。
460 2
|
5月前
|
JSON 缓存 自然语言处理
多语言实时数据微店商品详情API:技术实现与JSON数据解析指南
通过以上技术实现与解析指南,开发者可高效构建支持多语言的实时商品详情系统,满足全球化电商场景需求。
|
4月前
|
开发框架 .NET C#
ASP.NET Core Blazor 路由配置和导航
大家好,我是码农刚子。本文系统介绍Blazor单页应用的路由机制,涵盖基础配置、路由参数、编程式导航及高级功能。通过@page指令定义路由,支持参数约束、可选参数与通配符捕获,结合NavigationManager实现页面跳转与参数传递,并演示用户管理、产品展示等典型场景,全面掌握Blazor路由从入门到实战的完整方案。
460 6
|
4月前
|
监控 Cloud Native 测试技术
.NET技术深度解析:现代企业级开发指南
每日激励:“不要一直责怪过去的自己,他曾经站在雾里也很迷茫”。我是蒋星熠Jaxonic,一名在代码宇宙中探索的极客旅人。从.NET Framework到.NET 8,我深耕跨平台、高性能、云原生开发,践行领域驱动设计与微服务架构,用代码书写技术诗篇。分享架构演进、性能优化与AI融合前沿,助力开发者在二进制星河中逐光前行。关注我,共探技术无限可能!
.NET技术深度解析:现代企业级开发指南
|
4月前
|
JSON 算法 API
1688比价API接口:实现商品价格高效比较的技术指南
本文介绍1688比价API的核心功能与实战应用,涵盖接口调用、Python代码实现及价格比较算法优化。助您快速集成商品比价功能,提升电商开发效率。
618 3
|
4月前
|
JSON 安全 API
淘宝天猫上货API接口技术指南
本文介绍淘宝天猫上货API,详解其RESTful接口原理、认证流程及Python调用示例。涵盖商品添加、签名生成、响应处理,并提供代码实现与最佳实践,助力开发者高效实现自动化批量上架。
465 3
|
4月前
|
缓存 数据可视化 定位技术
快递鸟快递API技术指南:获取物流轨迹信息与轨迹地图的解决方案
在当今电商竞争激烈的环境中,物流体验已成为提升用户满意度的关键因素。研究表明,超过 75% 的消费者会因物流信息不透明而放弃下单。
1011 1
|
4月前
|
JSON 安全 API
1688批量上货API接口技术指南
本文介绍1688批量上货API的集成与使用,涵盖认证、请求构建及错误处理。通过Python示例代码,助您实现商品信息批量上传,提升电商运营效率。
261 1
|
4月前
|
JSON 搜索推荐 API
拼多多商品详情API技术指南
拼多多商品详情API(pdd.goods.detail.get)支持通过商品ID获取商品标题、价格、销量、图片、库存及评价等详细信息,适用于电商数据分析、竞品监控与价格策略优化,返回标准JSON格式,便于集成开发。

热门文章

最新文章