從零開始學習 asp.net core 2.1 web api 後端api基礎框架(七)-新增一個查詢單筆資料的方法
再寫一個查詢單筆資料的方法:
[Route("{id}")]
public JsonResult GetProduct(int id)
{
return new JsonResult(ProductService.Current.Products.SingleOrDefault(x => x.Id == id));
}
這裡Route引數裡面的{id}表示該action有一個引數名字是id. 這個action的地址是: "/api/product/{id}"
測試一下:
如果請求一個id不存在的資料:
Status code還是200, 內容是null. 因為框架找到了匹配url的action, 所以不會返回404, 但是我們如果找不到資料的話, 應該返回404錯誤才比較好.
Status code
http status code 是reponse的一部分, 它提供了這些資訊: 請求是否成功, 失敗的原因.
web api 能涉及到的status codes主要是這些:
200: OK
201: Created, 建立了新的資源
204: 無內容 No Content, 例如刪除成功
400: Bad Request, 指的是客戶端的請求錯誤.
401: 未授權 Unauthorized.
403
404: Not Found
409: 有衝突 Conflict.
500: Internal Server Error, 伺服器發生了錯誤.
返回Status Code
目前我們返回的JsonResult繼承與ActionResult, ActionResult實現了IActionResult介面.
因為web api不一定返回的都是json型別的資料, 也不一定只返回一堆json(可能還要包含其他內容). 所以JsonResult並不合適作為Action的返回結果.
例如: 我們想要返回資料和Status Code, 那麼可以這樣做:
[HttpGet]
public JsonResult GetProducts()
{
var temp = new JsonResult(ProductService.Current.Products)
{
StatusCode = 200
};
return temp;
}
但是每個方法都這麼寫太麻煩了.
asp.net core 內建了很多方法都可以返回IActionResult.
Ok, NotFound, BadRequest等等.
所以改一下方法:
namespace CoreBackend.Api.Controllers
{
[Route("api/[controller]")]
public class ProductController : Controller
{
[HttpGet]
public IActionResult GetProducts()
{
return Ok(ProductService.Current.Products);
}
[Route("{id}")]
public IActionResult GetProduct(int id)
{
var product = ProductService.Current.Products.SingleOrDefault(x => x.Id == id);
if (product == null)
{
return NotFound();
}
return Ok(product);
}
}
}
現在, 請求id不存在的資料時, 就返回404了.
如果我們用chrome直接進行這個請求, 它的效果是這樣的:
StatusCode Middleware
asp.net core 有一個 status code middleware StatusCodePages, 使用一下這個middleware看看效果,在Startup.cs中新增StatusCodePages的使用:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler();
}
app.UseStatusCodePages(); // status code middleware
app.UseMvc();
}
現在更友好了一些.
chrome直接進行這個請求: