Skip to content

使用.NET Core 3.x 构建 RESTFUL Api

Updated: at 06:05 AM

什么是WebApi?

MVC映射为API?

public void ConfigureServices(IServiceCollection services)
{
    //services.AddMvc(); core 3.0以前是这样写的,这个服务包括了    TageHelper等 WebApi不需要的东西,所有3.0以后可以不这样写
    services.AddControllers();
}

管道?

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints.MapControllers();
    });
}

API对外合约? API消费者需要使用到三个概念

API对外提供统一资源接口,业界对RESTful资源命名也有规则

关于如何标注路由属性 uri

using Microsoft.AspNetCore.Mvc;
using Routine.Api.Service;
using System;
using System.Threading.Tasks;

namespace Routine.Api.Controllers
{
    [ApiController] //好处:ApiController不是强制的
                    //1.会启用使用属性路由(Attribute Routing)
                    //2.自动HTTP 400响应
                    //3.推断参数的绑定源
                    //4.Multipart/form-data 请求推断
                    //5.错误状态代码的问题详细信息
    [Route("api/companies")]    //写法一
    //[Route("api/[controller]")]   //写法二:意思是相当于刨除了Controller后缀,获取前面的 Companies C可以是小写,如果你改名了那么你路由的uri也跟着变了(不建议这样写)
    public class CompaniesController:ControllerBase
    {
        private readonly ICompanyRepository _companyRepository;
        public CompaniesController(ICompanyRepository companyRepository)
        {
            _companyRepository = companyRepository ??
                                 throw new ArgumentNullException(nameof(companyRepository));
        }
        [HttpGet]
        //IActionResult定义了一些合约,它可以代表ActionResult返回的结果
        public async Task<IActionResult> GetCompanies()
        {
            var companies =await _companyRepository.GetCompaniesAsync();//读取出来的是List
            return Ok(companies);
        }

        [HttpGet("{companyId}")] // Controller标注了ApiController => uri=> api/companies/{companyId}
        public async Task<IActionResult> GetCompany(Guid companyId)
        {
            //判断该公司是否存在方法一:这种方法在处理并发请求时可能会出现错误,原因是查到之后,进行删除,进入company后也可能是404找不到了
            //var exists =await _companyRepository.CompanyExistsAsync(compamyId);
            //if (!exists)
            //{
            //    //不存在应该返回404
            //    return NotFound();
            //}
            var company = await _companyRepository.GetCompanyAsync(companyId);//读取出来的是List
            //方法二
            if (company==null)
            {
                return NotFound();
            }
            return Ok(company);
        }
    }
}