• ASP.NET Core API Controllers用法
  • 发布于 2个月前
  • 129 热度
    0 评论
  • Dock
  • 0 粉丝 38 篇博客
  •   
在ASP.NET Core 中创建Web API是非常方便的,在你创建的控制器上只需要做3件事情:
(1) 在Controller上使用[ApiController]特性,这个特性告诉控制器使用HTTP API响应
(2) 控制器继承ControllerBase,而不是继承自Controller
(3) 应用路由特性[Route("someUrl/[controller]")]
下面是一个Web API的控制器:
[ApiController]
[Route("someURL/[controller]")]
public class ExampleController : ControllerBase
一.什么是Web API
Web API是通过使用HTTP协议来访问的API,例如:我们能够在浏览器中调用股票市场提供的Web API获取当前组织的股票价格, Web API可以使用任何技术例如:ASP.NET Core,JAVA,Python等,你也可以使用任何技术消费Web API,这使得 Web API在不同技术构建的应用程序之间通讯提供了完美的选择。

Web API的工作是传输数据在互联网,这些数据传输使用了HTTP协议的请求方法,我们众所周知的HTTP动词,常用的HTTP 动词有GET,POST,PUT,PATCH和DELETE, Web API使用JSON和XML文件格式的数据在互联网上传输数据。


二.ControllerBase vs Controller类
创建Web API控制器不需要继承自Controller类,这是因为Controller类继承了ControllerBase类并且添加了视图功能,它是针对处理Web页面,而不是WEB API请求有一个特殊的规则:如果你想要使用相同的控制器针对视图和Web API,你只需要继承Controller类,你可以检查ASP.NET Core Web API脚手架,该控制器继承了ControllerBase类。
ControllerBase类提供了一些HTTP请求的属性和方法非常有用,如下所示:

三. ApiController特性是什么
Web API控制器必须使用[ApiController]特性,以至于他们能够指定API特定行为,这些行为如下:
3.1 响应路由特性
3.2 当没有在服务器上找见资源时自动触发HTTP 400
3.3 定义action方法参数值所在的位置,我们使用[FromBody], [FromForm], [FromHeader], [FromQuery], [FromRoute] 特性定义这些位置
3.4 当action方法的参数用[FromForm]属性注释时,将推断为multipart/form-data请求的内容类型

3.5 使得Web API返回的错误基于 RFC 7807 规范 ,这使得使用不同技术(如Java、Ruby、ASP.NET Core等)创建的Web API能够无缝地相互通信,而不会出现任何问题。


四. 例子
在Visual Studio中创建一个新的项目,选择ASP.NET Core Web APP(MVC)模板命名为APIControllers

4.1 Model & Repository
在Model文件夹下添加Reservation.cs类,代码如下:
namespace AspNetCore.APIControllers.Models
{
    public class Reservations
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string StartLocation { get; set; }
        public string EndLocation { get; set; }
    }
}
接下来在Models文件夹添加一个文件IRepository.cs,接口定义如下:
namespace AspNetCore.APIControllers.Models
{
    public interface IRepository
    {
        IEnumerable<Reservation> Reservations { get; }
        Reservation this[int id] { get; }
        Reservation AddReservation(Reservation reservation);
        Reservation UpdateReservation(Reservation reservation);
        void DeleteReservation(int id);
    }
}
最后,添加一个Repository类实现该接口:
using Microsoft.AspNetCore.Mvc;

namespace AspNetCore.APIControllers.Models
{
    public class Repository : IRepository
    {
        private Dictionary<int, Reservation> items;
        public Repository()
        {
            items = new Dictionary<int, Reservation>();
            new List<Reservation> {
                new Reservation {Id=1, Name = "Ankit", StartLocation = "New York", EndLocation="Beijing" },
                new Reservation {Id=2, Name = "Bobby", StartLocation = "New Jersey", EndLocation="Boston" },
                new Reservation {Id=3, Name = "Jacky", StartLocation = "London", EndLocation="Paris" }
                }.ForEach(r => AddReservation(r));
        }
        public Reservation this[int id] => items.ContainsKey(id) ? items[id] : null;
        public IEnumerable<Reservation> Reservations => items.Values;
        public Reservation AddReservation(Reservation reservation)
        {
            if (reservation.Id == 0)
            {
                int key = items.Count;
                while (items.ContainsKey(key)) { key++; };
                reservation.Id = key;
            }
            items[reservation.Id] = reservation;
            return reservation;
        }
        public void DeleteReservation(int id) => items.Remove(id);
        public Reservation UpdateReservation(Reservation reservation) => AddReservation(reservation);
    }
}
这个类包含的属性和方法基本增删改查操作并且所有的reservation对象存储在字典类型中,这些方法和属性为:
AddReservation – 创建一个Reservation对象
Reservations – 读取Reservation
UpdateReservation – 更新Reservations
DeleteReservation –删除Reservations
4.2 修改Program类中配置
builder.Services.AddSingleton<IRepository, Repository>();
五. Web API控制器
现在是创建Web API控制器最重要的部分。请记住,这个控制器只是一个普通的控制器,允许检索或修改模型中的数据,然后将其传递给客户端,它可以在不使用常规控制器提供的操作的情况下完成这些操作。

数据传递遵循一种REST的模式,REST(Representational State Transfer)其中包含两个要素:
1.操作方法(Action Methods):执行特定操作,然后将一些数据传递给客户端,这些方法使用attribute修饰,只能使用HTTP请求调用
2.URLs(统一资源定位符):定义操作任务,这些操作可以是发送数据的全部或部分,添加、删除或更新记录,可以是任何操作
首先我们添加一个NuGet的Microsoft.AspNetCore.JsonPatch包,这个是为了支持JSON Patch,如下所示:

接下来在Controllers文件夹下添加一个ReservationController控制器,代码如下:
using AspNetCore.APIControllers.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.JsonPatch;
using Microsoft.AspNetCore.Mvc;

namespace AspNetCore.APIControllers.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ReservationController : ControllerBase
    {
        private IRepository repository;
        public ReservationController(IRepository repo) => repository = repo;
        // 堆代码 duidaima.com
        [HttpGet]
        public IEnumerable<Reservation> Get() => repository.Reservations;

        [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]);
        }

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

        [HttpPut]
        public Reservation Put([FromForm] Reservation res) => repository.UpdateReservation(res);

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

        [HttpDelete("{id}")]
        public void Delete(int id) => repository.DeleteReservation(id);
    }
}

注意:控制器继承ControllerBase类并且有[ApiController]特性使用到该类上,控制器从构造函数中获取IRepository对象使用依赖注入方法


六. api 控制器路由
我们能够使用https://localhost:7205/api/Reservation地址来调用api 控制器

url调用的是Reservation控制器的Get方法,这个方法的代码如下:
[HttpGet]
public IEnumerable<Reservation> Get() => repository.Reservations;
正如你看到了这个方法以JSON格式在浏览器中返回了所有的对象。
用户评论