• .NET Core API Controllers用法详解
  • 发布于 2个月前
  • 271 热度
    0 评论
一. 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特性:

二 [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格式返回:

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

三.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
});
四. HttpPut方法
HttpPut方法用于更新Reservation对象,URL https://localhost:44324/api/Reservation 发出类型为PUT的HTTP请求时,将调用该操作
// 堆代码 duidaima.com
[HttpPut]
public Reservation Put([FromForm] Reservation res) => repository.UpdateReservation(res);
[FromForm]特性在参数中确保客户端发送的表单数据能够绑定到Reservation对象,这里使用模型绑定技术,这个方法以JSON格式返回更新的Reservation对象。你可以在参数中使用[FromBody]特性替换[FromForm]特性,这取决于客户端发送数据的格式,如果你使用FromBody特性,数据以JSON格式发送,否则FromForm特性以表单数据发送。

五. 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);
六. 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方法的工作详细:

用户评论