前言
前面簡單介紹了一下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 是一張表,表裏面是空的表還在,但是如果某條數據不在那麼就是這個資源沒有找到,看圖:
公司一是沒有盒子的,也就是說沒有容器,找不到就是沒有。
結
後續持續更新。