//首先将mvc注册到容器中
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(); // 注册MVC到Container
}
//然后我们在configure里面使用mvc中间件
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler();
}
//使用mvc中间件
app.UseMvc();
路由:
路由有两种方式:
1.convention-based(按约定)
主要用于mvc(返回view或者razor page那种)
2.attribute-based(基于路由属性配置的)
webapi推荐使用
基于这种配置属性可以配置Controller或者Action级别的,
uri会根据http method来匹配到一个controller的具体action上。
常见的:
Get, 查询, Attribute: HttpGet, 例如: '/api/product', '/api/product/1'
POST, 创建, HttpPost, '/api/product'
PUT 整体修改更新 HttpPut, '/api/product/1'
PATCH 部分更新, HttpPatch, '/api/product/1'
DELETE 删除, HttpDelete, '/api/product/1
还有一个Route属性(attribute)也可以用于Controller层, 它可以控制action级的URI前缀.
namespace CoreBackend.Api.Controllers
{
//[Route("api/product")]
[Route("api/[controller]")]
public class ProductController: Controller
{
[HttpGet]
public JsonResult GetProducts()
{
return new JsonResult(new List<Product>
{
new Product
{
Id = 1,
Name = "牛奶",
Price = 2.5f
},
new Product
{
Id = 2,
Name = "面包",
Price = 4.5f
}
});
}
}
}
1.使用attribute(标签)
[Route(""api/[controller])],使得整个Controller下面的所有action的uri的前缀变成了/api/product,
2.[controller]表示XxxController的Xxx(小写);
3.然后在GetProducts方法上面, 写上HttpGet, 也可以写HttpGet(). 它里面还可以加参数,例如: HttpGet(“all”), 那么这个Action的请求的地址就变成了 “/api/product/All”.
WebApi常见的status code
200: OK
201: Created, 创建了新的资源
204: 无内容 No Content, 例如删除成功
400: Bad Request, 指的是客户端的请求错误.
401: 未授权 Unauthorized.
403: 禁止操作 Forbidden. 验证成功, 但是没法访问相应的资源
404: Not Found
409: 有冲突 Conflict.
500: Internal Server Error, 服务器发生了错误.
目前我们的返回的JsonResult继承于ActionResult,
ActionResult实现了IActionResult接口。
(web api不一定返回的都是json数据)
例如:我们想返回数据和状态码
[HttpGet]
public JsonResult GetProducts()
{
var temp = new JsonResult(ProductService.Current.Products)
{
StatusCode = 200
};
return temp;
}
asp.net core内置了很多方法都可以返回IActionResult,如:
Ok,NotFound,BadRequest
例子:
[HttpGet]
public JsonResult GetProducts()
{
var temp = new JsonResult(ProductService.Current.Products)
{
StatusCode = 200
};
return temp;
}
asp.net core里面有一个status code middleware
app.UseStatusCodePages();
结果的格式:
asp.net core 2.0的默认返回结果格式是Json,并使用json.net 对结果默认做了camel case的转化。(首字母小写)
内容协商
若web api提供了多种内容格式,那么可以通过Accept Header来选择最好的内容返回格式,如:
application/json,application.xml。
asp.net core默认提供的是json
我们可以在app.UseMvc()中修改它的返回格式!