RestfulApi 学习笔记——.net core入门操作(二)
前言
前面简单介绍了一下restfulapi是什么东西,那么我们应该在.net core 中如何实现呢?或者说该怎么做才能有这个restful api呢?
正文
幸运的是.net core帮助我们实现了,restfulapi,但是不是强制性的,我们需要加上属性ApiController,表示符合restful api规则。
这个也是非常常用的,那么ApiController有什么特性吗?
1.要求使用属性路由(attribute routing)
2.自动响应400。
3.推断参数的绑定源
4.multipart/form-data 请求推断
5.错误状态的问题详细信息
解释一下,第一个属性路由什么意思呢?
[ApiController]
[Route("api/Companies")]
public class CompaniesController : ControllerBase
就是使用了ApiController就一定要使用Route("api/Companies"),当然他可以放在方法上,也可以放在类上。
这里我们看到有些是这样写的:[Route("api/[Controller]")] 表示使用当前的类Companies作为名字,但是一旦这个类名改变了,那么api 也变了,所以这个可以写死。
第二个自动响应400,这个400是什么意思呢?是客户端传递的参数不正确,不符合后台规则,那么就会自动返回400,这个后面解释。
第三个推断参数的绑定源,这个我们写过的都明白,不解释了。
第四个是什么意思呢?第四个的意思是这样的。
比如谁它自动推断参数的绑定源,但是去哪里获取呢?是去body 里面还是去form-data 里面,还是去url链接上,这都是值得思考的问题。
那么使用这个ApiController,都是从multipart/form-data 中获取,其他的我们可以特殊表面,如下:
第五个可以返回错误详情,这个是这样的,如果错误了会返回一条链接,打开这条链接可以查看到具体错误,这个后面章节会介绍到。
这里给个例子:
[Route("api/Companies")]
[ApiController]
public class CompaniesController : ControllerBase
{
private readonly ICompanyRepository _companyRepository;
public CompaniesController(ICompanyRepository companyRepository)
{
_companyRepository = companyRepository ?? throw new ArgumentException(nameof(companyRepository));
}
[HttpGet]
public async Task<IActionResult> GetCompanies(CompanyDtoParameters parameters)
{
var companies = await _companyRepository.GetCompaniesAsync(parameters);
return new JsonResult(companies);
}
[HttpGet("{companyId}")]
public async Task<IActionResult> GetCompany(Guid companyId)
{
var company = await _companyRepository.GetCompanyAsync(companyId);
if (company == null)
{
return NotFound();
}
return Ok(company);
}
}
这里有人就奇怪了,不是说好不能写GetCompanies,然后我这里还写呢?
是这样的,如果访问这个api呢,get 请求,访问的是getCompanies 这个方法,但是api是api/Companies。
因为他是get请求,所以会请求到getCompanies,api/Companies 表示的是资源,而不是某个方法,这是要注意的地方。
这里另外一个可能觉得奇怪的地方在于,你看 访问api/Companies 调用GetCompanies 返回为空,而api/Companies/1 调用GetCompany为空的时候返回的404,为啥区别待遇呢?
因为别人在调用api/Companies的时候访问的这个资源为空,那么这个资源里面的东西为空,但是这个壳子还在。
可以这么理解,company 是一张表,表里面是空的表还在,但是如果某条数据不在那么就是这个资源没有找到,看图:
公司一是没有盒子的,也就是说没有容器,找不到就是没有。
结
后续持续更新。