基于 Controller 的 Web API
ASP.NET Wep API 的請求架構(gòu)
客戶端發(fā)送Http請求,Contoller響應(yīng)請求,并從數(shù)據(jù)庫讀取數(shù)據(jù),序列化數(shù)據(jù),然后通過 Http Response返回序列化的數(shù)據(jù)。
ControllerBase 類
Web API 的所有controllers 一般繼承于 ControllerBase 類,而不是Controller 類。
因為 Controller 類也繼承自ControllerBase 類,但是支持views,而API一般不需要這個功能。
ControllerBase 提供了很多處理Http Request 和 Response方法,比如返回201結(jié)果的CreatedAtAction(表示成功創(chuàng)建資源):
[HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public ActionResult<Pet> Create(Pet pet)
{
pet.Id = _petsInMemoryStore.Any() ?
_petsInMemoryStore.Max(p => p.Id) + 1 : 1;
_petsInMemoryStore.Add(pet);
return CreatedAtAction(nameof(GetById), new { id = pet.Id }, pet);
}
其他一些主要方法:
- Ok(),返回空的 http code 200
- File(),返回文件和 http code 200,或者返回部分文件和 http code 206,或者不支持的Range和http code 416
- PhysicalFile(),返回文件和 http code 200,或者返回部分文件和 http code 206,或者不支持的Range和http code 416
- CreatedAtAction(),返回 http code 201
- AcceptedAtAction(),返回 http code 202
- NoContent(),返回 http code 204
- Content(),返回具體結(jié)果,plain-text 格式
- RedirectToActionPermanent(),返回 http code 301
- RedirectToPagePermanent(),返回 http code 301
- RedirectToPage(),返回 http code 302
- RedirectToRoute(),返回 http code 302
- RedirectToAction(),返回 http code 302
- RedirectToActionPreserveMethod(),返回 http code 307
- RedirectToPagePreserveMethod(),返回 http code 307
- RedirectToActionPermanentPreserveMethod(),返回 http code 308
- RedirectToPagePermanentPreserveMethod(),返回 http code 308
- BadRequest(),返回 http code 400
- Problem(),返回 http code 400
- ValidationProblem(),返回 http code 400
- Unauthorized(),返回 http code 401
- Challenge(),返回 http code 401 或 403
- Forbid() ,返回 http code 403
- NotFound(),返回 http code 404
- Conflict() ,返回 http code 409
- UnprocessableEntity(),返回 http code 422
- SignIn()
- SignOut()
- StatusCode(Int32)
重要的屬性
- ControllerContext
- HttpContext,獲取當(dāng)前action的HttpContext
- Url,IUrlHelper對象
- Request,獲取當(dāng)前action的HttpRequest
- Response,獲取當(dāng)前action的HttpResponse
- RouteData,獲取當(dāng)前action的RouteData
- User,獲取當(dāng)前action關(guān)聯(lián)的User的ClaimsPrincipal
重要的Attributes
標(biāo)識 Action的功能,包括:
- [ApiController],表示這個Action為HTTP API responses服務(wù)。包括:
- 必須要指定 [Route(“[controller]”)]
- 自動驗證model
- 自動bind,包括[FromBody]等
- 推斷 multipart/form-data 的類型
- [Area],指定Route
- [Bind],
- Route,指定Route
- [Consumes],指定action 接收的數(shù)據(jù)類型,比如 [Consumes(“application/xml”)], [Consumes(“application/json”)],[Consumes(“application/x-www-form-urlencoded”)]
- [Produces],指定action 返回的數(shù)據(jù)類型
- [HttpGet],
- [HttpDelete],
- [HttpPost],
- [HttpPut],
- [HttpPatch],
- [HttpOptions],
- [HttpHead],
- [NonAction],表示不是Action方法
- [NonController],表示不是NonController方法
- [FromBody],標(biāo)識參數(shù)或?qū)傩钥梢越壎˙ody,比如:
- public IActionResult Action3([FromBody] Product product, [FromBody] Order order)
- [FromHeader],
- [FromForm],
格式化Action 的返回結(jié)果
Action 不一定要返回某個特定類型,ASP.NET Core 支持任何對象類型。
Actions 可以忽略 HttpRequest的Header的Accept,返回自己想要的類型。
如果返回結(jié)果類型不是IActionResult,那么會被序列化。
ControllerBase.Ok 默認(rèn)返回Json類型。
Http Reponse 的 content-type: application/json; charset=utf-8.
[HttpGet]
public IActionResult Get()
=> Ok(todoItemStore.GetList());
而下面這個,Content-Type是text/plain。
[HttpGet("Version")]
public ContentResult GetVersion()
=> Content("v1.0.0");
協(xié)商結(jié)果類型
當(dāng)HttpRequest 指定了Header的Accept,而 Action返回的類型是JSON時,會發(fā)生結(jié)果協(xié)商。
ASP.NET Core 默認(rèn)支持的結(jié)果類型:
- application/json
- text/json
- text/plain
- 當(dāng)Header的Accept中指定了一個類型是Action支持的類型時,則返回這個類型。
- 如果Action不支持指定的類型,且設(shè)置了MvcOptions.ReturnHttpNotAcceptable為true,則返回406。
- 用Action中第一個formatter 返回結(jié)果。
- 當(dāng)Header的Accept中沒有指定類型時,用Action中第一個formatter 返回結(jié)果。
- 當(dāng)Header的Accept中包含"/"時,會被忽略,由Action決定。
- 當(dāng)請求來自于瀏覽器時,Accept 會被忽略,由Action決定,默認(rèn)返回JSON。
- 當(dāng)請求來自于瀏覽器時,Accept 會被忽略,如果Host設(shè)置了RespectBrowserAcceptHeader為true,則使用瀏覽器的header。
如果 Action返回的結(jié)果是復(fù)雜類型時,.NET 會創(chuàng)建一個 ObjectResult,封裝結(jié)果,然后序列化成協(xié)商的結(jié)果類型。比如:文章來源:http://www.zghlxwxcb.cn/news/detail-686950.html
[HttpGet("{id:long}")]
public TodoItem? GetById(long id)
=> _todoItemStore.GetById(id);
設(shè)置成XML結(jié)果類型
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddXmlSerializerFormatters();
設(shè)置成使用json.net的結(jié)果類型
默認(rèn)的JSON格式是基于System.Text.Json的。文章來源地址http://www.zghlxwxcb.cn/news/detail-686950.html
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddNewtonsoftJson();
到了這里,關(guān)于ASP.NET Core 中基于 Controller 的 Web API的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!