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 是一张表,表里面是空的表还在,但是如果某条数据不在那么就是这个资源没有找到,看图:

公司一是没有盒子的,也就是说没有容器,找不到就是没有。

后续持续更新。

原文地址:https://www.cnblogs.com/aoximin/p/13912142.html