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特性:2 [HttpGet] 方法 有两种[HttpGet]方法被HTTP请求Get动作调用,这两种方法工作方式如下:
第一种action方法以JSON格式返回所有的数据到客户端,控制器操作的默认返回类型是JSON,因此当传递类对象时,数据将以JSON格式进行传输HttpGet特性没有包含路由段因此URL调用action方法是-https://localhost:7205/api/Reservation
第二个action方法包含路由段,它能根据指定的id返回特定的对象,使用OK()方法返回状态码200并且同时也返回了一个对象到客户端,方法返回的的类型为ActionResult<Reservation>. 调用这个action方法的url:[HttpGet]
public IEnumerable<Reservation> Get() => repository.Reservations;
这个action方法如下所示:https://localhost:7205/api/Reservation/1
https://localhost:7205/api/Reservation/2
https://localhost:7205/api/Reservation/3
[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格式返回:
如果你访问url-https://localhost:7205/api/Reservation/1 在浏览器,你将会获取第一个对象:
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请求时,将调用该操作
[FromForm]特性在参数中确保客户端发送的表单数据能够绑定到Reservation对象,这里使用模型绑定技术,这个方法以JSON格式返回更新的Reservation对象[HttpPut]
public Reservation Put([FromForm] Reservation res) => repository.UpdateReservation(res);
你可以在参数中使用[FromBody]特性替换[FromForm]特性,这取决于客户端发送数据的格式,如果你使用FromBody特性,数据以JSON格式发送,否则FromForm特性以表单数据发送
5 HttpDelete方法
HttpDelete操作从Repository中删除一个Reservation,当发起类型为DELETE的HTTP请求时,将调用该方法,URL如下:
注意:Reservation被删除通过传递第三段url,这个方法显示如下:https://localhost:7205/api/Reservation/1
https://localhost:7205/api/Reservation/2
https://localhost:7205/api/Reservation/3
[HttpDelete("{id}")]
public void Delete(int id) => repository.DeleteReservation(id);
6 HttpPatch方法
[
{ "op": "replace", "path": "Name", "value": "Ram"},
{ "op": "replace", "path": "StartLocation", "value": "Moscow"}
]
JSON有op属性指定操作的类型,path指定该操作应用那个属性,value表示指定的新的值
[ ]
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方法的工作详细:
源代码地址:
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
一起交流学习
▲ 点击上方卡片关注DotNet NB,一起交流学习
请在公众号后台
回复 【路线图】 获取.NET 2023开发者路线图 回复 【原创内容】获取公众号原创内容 回复 【峰会视频】获取.NET Conf开发者大会视频 回复 【个人简介】获取作者个人简介 回复 【年终总结】获取作者年终总结 回复 【 加群 】 加入DotNet NB 交流学习群长按识别下方二维码,或点击阅读原文。 和我一起,交流学习,分享心得。