首页 文章详情

ASP.NET Core API Controllers 系列二

DotNet NB | 4 2024-01-05 01:20 0 0 0
UniSMS (合一短信)

1 Web API Action 方法

一个Web API有GET/POST/PUT/PATCH/DELETE/HEAD 类型的方法,根据进入的请求确定调用哪个方法类型

例如:

HTTP GET类型请求将被GET类型的方法处理

HTTP POST 类型请求将被POST类型的方法处理

ASP.NET Core默认将做下面事情:

1.1 如果action方法返回字符串将发送到客户端,同时设置Context-Type响应头位text/plain

1.2 如果action方法以JSON格式返回到客户端,例如:int, datetime, object, 简单类型,复杂类型等,同时也会设置Context-Type响应头位application/json

Web API控制器的操作方法使用一些HTTP特性。因此,它们只能由特定的HTTP方法(称为动词)调用

下表中定义HTTP特性:

8e2f00603d20e368abc77ac3b1072e44.webp

2 [HttpGet] 方法 有两种[HttpGet]方法被HTTP请求Get动作调用,这两种方法工作方式如下:

第一种action方法以JSON格式返回所有的数据到客户端,控制器操作的默认返回类型是JSON,因此当传递类对象时,数据将以JSON格式进行传输HttpGet特性没有包含路由段因此URL调用action方法是-https://localhost:7205/api/Reservation

      
        [HttpGet]
      
      
        public IEnumerable<Reservation> Get() => repository.Reservations;
      
    
第二个action方法包含路由段,它能根据指定的id返回特定的对象,使用OK()方法返回状态码200并且同时也返回了一个对象到客户端,方法返回的的类型为ActionResult<Reservation>. 调用这个action方法的url:
      
        https://localhost:7205/api/Reservation/1
      
      
        https://localhost:7205/api/Reservation/2
      
      
        https://localhost:7205/api/Reservation/3
      
    
这个action方法如下所示:
      
        [HttpGet("{id}")]
      
      
        public ActionResult<Reservation> Get(int id)
      
      
        {
      
      
            if (id == 0)
      
      
                return BadRequest("Value must be passed in the request body.");
      
      
            return Ok(repository[id]);
      
      
        }
      
    

如果客户端在请求中没有发送id在这种情况下我们将获取默认值为0,因此我返回BadRquest()响应

Http Get请求可以直接在浏览器中调用,运行应用程序并且进入URL https://localhost:44324/api/Reservation, 你将会看到所有的对象以JSON格式返回:

e53c6a22ed717d0635897d910a704db4.webp

如果你访问url-https://localhost:7205/api/Reservation/1 在浏览器,你将会获取第一个对象:

7fcb64883ca651e4c4e85f15d7c2eec4.webp

3 HttpPost 方法

HttpPost方法使用创建一个新的Reservation对象,它在参数中接受Reservation对象,

应用于其参数的 [FromBody]属性确保来自客户端的请求体内容将被解码并放入该参数中

调用方法的URL是https://localhost:7205/api/Reservation,注意尽管URL和GET方法相同,[HttpPost]特性确保只有HTTP post请求类型被调用

这个action方法以JSON形式返回一个新添加的Reservation对象,Reservation对象也包含了当前创建的Id字段,代码如下:

      
        [HttpPost]
      
      
        public Reservation Post([FromBody] Reservation res) =>
      
      
        repository.AddReservation(new Reservation
      
      
          {
      
      
              Name = res.Name,
      
      
              StartLocation = res.StartLocation,
      
      
              EndLocation = res.EndLocation
      
      
        });
      
    

4 HttpPut方法

HttpPut方法用于更新Reservation对象,URL https://localhost:44324/api/Reservation 发出类型为PUT的HTTP请求时,将调用该操作

      
        [HttpPut]
      
      
        public Reservation Put([FromForm] Reservation res) => repository.UpdateReservation(res);
      
    
[FromForm]特性在参数中确保客户端发送的表单数据能够绑定到Reservation对象,这里使用模型绑定技术,这个方法以JSON格式返回更新的Reservation对象

你可以在参数中使用[FromBody]特性替换[FromForm]特性,这取决于客户端发送数据的格式,如果你使用FromBody特性,数据以JSON格式发送,否则FromForm特性以表单数据发送

5 HttpDelete方法

HttpDelete操作从Repository中删除一个Reservation,当发起类型为DELETE的HTTP请求时,将调用该方法,URL如下:

      
        https://localhost:7205/api/Reservation/1
      
      
        https://localhost:7205/api/Reservation/2
      
      
        https://localhost:7205/api/Reservation/3
      
    
注意:Reservation被删除通过传递第三段url,这个方法显示如下:
      
        [HttpDelete("{id}")]
      
      
        public void Delete(int id) => repository.DeleteReservation(id);
      
    

6 HttpPatch方法

HttpPatch操作可以执行多个操作针对客户端发送的Reservation对象,如添加、删除、更新、复制等,在这里,客户端只以JSON格式向API发送特定对象的属性,而不是整个Reservation对象 JSON格式如下:
      
        [
      
      
            { "op": "replace", "path": "Name", "value": "Ram"},
      
      
            { "op": "replace", "path": "StartLocation", "value": "Moscow"}
      
      
        ]
      
    

JSON有op属性指定操作的类型,path指定该操作应用那个属性,value表示指定的新的值

ASP.NET Core 将自动处理JSON数据并将其作为JsonPatchDocument<T>对象发送到操作方法,其中T是要修改的模型对象的类型(在这里是Reservation对象) 然后使用JsonPatchDocument对象通过ApplyTo()方法修改存储库中的对象
      
        [HttpPatch("{id}")]
      
      
        
          public StatusCodeResult Patch(int id, [FromBody] JsonPatchDocument<Reservation> patch)
        
      
      
        {
      
      
            var res = (Reservation)((OkObjectResult)Get(id).Result).Value;
      
      
            if (res != null)
      
      
            {
      
      
                patch.ApplyTo(res);
      
      
                return Ok();
      
      
            }
      
      
            return NotFound();
      
      
        }
      
    

调用Get(id)方法获取reservation并且转化成OkObjectResult,随后进行了一次强制类型转换以获取Reservation类型对象中的值 -

      
        var res = (Reservation)((OkObjectResult)Get(id).Result).Value;
      
    
如果你使用的ASP.NET Core 版本3及以上的 Web API,你需要使用AddNewtonsoftJson 替代了用于格式化所有JSON内容的基于 System.Text.Json 的输入和输出格式化程序。因此,必须在你的API项目中启用JSON Patch支持

安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet 包 在 Program.cs 中调用 AddNewtonsoftJson() 方法,如下面的代码所示

      
        builder.Services.AddControllersWithViews().AddNewtonsoftJson();
      
    

下面的表格总结了每个action方法的工作详细:

ba835f3aab640b4dee3fd3f308416971.webp

源代码地址:

https://github.com/bingbing-gui/Asp.Net-Core-Skill/tree/master/Fundamentals/AspNetCore.APIControllers/AspNetCore.APIControllers

关于API Controller两篇文章参考文献如下:
https://www.yogihosting.com/aspnet-core-api-controllers/
推荐阅读:
.NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(测试篇)
.NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
一款基于.NET Core的快速开发框架、支持多种前端UI、内置代码生成器
.NET 中如何实现高精度定时器
9 个 .NET UI 框架,您的选择是?
探索 C# 12 Interceptor 的魔力

点击下方卡片关注DotNet NB

一起交流学习

ae7865aed0db97a3c8a9139f2c5b4d0e.webp

▲ 点击上方卡片关注DotNet NB,一起交流学习

请在公众号后台

回复 【路线图】 获取.NET 2023开发者路线图 回复 【原创内容】获取公众号原创内容 回复 【峰会视频】获取.NET Conf开发者大会视频 回复 【个人简介】获取作者个人简介 回复 【年终总结】获取作者年终总结 回复  加群 加入DotNet NB 交流学习群
长按识别下方二维码,或点击阅读原文。 和我一起,交流学习,分享心得。

4a05c66c6f29ad124d4399f7b24469b5.webp


5f3ba09428cf9ecda2f33222fa94ccf7.webp


good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter