概述
概述
ControllerBase类
ControllerBase针对Web Api,而Controller针对Web View,除非一个Controller同时需要Web Api和Web View
ApiController 属性
1.属性路由要求
2.自动HTTP 400响应
3.绑定源参数推理
4.Multipart/form-data 请求推理
5.错误状态代码的问题详细信息
自动 HTTP 400 响应
模型验证错误,自动返回HTTP 400。
可以禁用自动HTTP 400
默认 BadRequest 响应
services.AddControllers()
.ConfigureApiBehaviorOptions(options =>
{
options.SuppressConsumesConstraintForFormFileParameters = true;
options.SuppressInferBindingSourcesForParameters = true;
options.SuppressModelStateInvalidFilter = true;
options.SuppressMapClientErrors = true;
options.ClientErrorMapping[404].Link =
"https://httpstatuses.com/404";
});
绑定源参数推理
frombody对于复杂类型会自动推理,对于简单类型不会(需要[frombody]标签)
添加模型类
1.数据库模型
添加数据库上下文
有2中方法,但是为了能够使用DI,选择下面的方法:
public class TodoContext:DbContext
{
public TodoContext(DbContextOptions<TodoContext> options)
: base(options)
{
}
public DbSet<TodoItem> TodoItems { get; set; }
}
注册数据库上下文
services.AddDbContext<TodoContext>(opt =>
opt.UseInMemoryDatabase("TodoList"));
可以使用各种数据库,在使用数据库时,还需要添加数据库连接字符串,可以直接写在这里,也可以写在配置文件中。
构建控制器
1.可以自己一个一个构建
2.使用内置的基架为我们自动创建CURD(不全)
注意事项
1.创建项目返回CreatedAtAction,该方法返回HTTP 201,向相应添加位置标头(此处应该使用nameof,方便重构),并返回刚才添加的数据。以便直接使用该位置标头来获取我们刚刚创建的资源(把POST改成GET)
CreatedAtAction(nameof(GetTodoItem), new { id = todoItem.Id }, todoItem);
指定Action,指定query,指定返回的数据
2.Get方法一般有2个
GetResources:所有资源
GetResources/{id}:单个资源
3.PUT方法修改整个资源,可以采用利用EF Core整体更新的策略,而不需要自己做判断
_context.Entry(todoItem).State = EntityState.Modified;
然后在保存时,捕获异常,无异常则修改成功
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!TodoItemExists(id))
{
return NotFound();
}
else
{
throw;
}
}
最后,返回的HTTP状态吗为204,表示没有任何返回值
4.使用HTTP Patch部分更新
5.使用HTTP Delete删除资源,返回HTTP 204,或者返回被删除的资源(200)也可以
返回类型
特定类型
一个具体的类型,string,int,List
返回 IEnumerable<T> 或 IAsyncEnumerable<T>
public IEnumerable<Product> GetOnSaleProducts() =>
_context.Products.Where(p => p.IsOnSale);
1.上面的例子会一遍查询数据库,一遍序列化返回值,会造成很多问题
解决的办法是在查询中家兔ToList(),一次性查询完毕,在内存中序列化。
2.不过在3.0中已经优化了该方法,会先缓冲所有数据再序列化
3.也可以采用IAsyncEnumerable来返回数据
IActionResult
当操作中有多个ActionResult状态码时,可以使用IActionResult ,只能返回HTTP 状态码
ActionResult<T> 类型
支持返回从 ActionResult 派生的类型或返回特定类型,可以返回HTTP状态码和特殊的类型
处理JSON PATCH请求
语法
1.op 属性指示操作的类型。
2.path 属性指示要更新的元素。
3.value 属性提供新值。
路径语法
JsonPatch
操作方法
1.指定HttpPatch属性
2.[FromBody]JsonPatchDocument<T>
3.调用ApplyTo
注意:JsonPatchDocument中的json数据是用NewtonsoftJson这个库来处理的,原来asp.net core2.2默认的json数据处理库就是NewtonsoftJson,而3.0中默认的是System.Text.Json所以会造成无法解析这个json的情况,值需要安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson这个库,然后services.AddControllers().AddNewtonsoftJson();就可以正常使用了。
格式化响应数据
特定于格式的操作结果
一般返回ActionResult<T>。
如果要返回字符串,返回Content("XXX"),不要直接返回string
内容协商
1.返回的方法的OBjectResult
2.默认返回类型为,application/json、text/json 和 text/plain
3.添加XML返回格式services.AddControllers().AddXmlSerializerFormatters();
4.HTTP 请求时要设置accept格式我XML
5.设置json格式
services.AddControllers().AddJsonOptions(options=>
{
options.JsonSerializerOptions.IgnoreNullValues = true;
options.JsonSerializerOptions.PropertyNamingPolicy = null;
});
6.可以直接使用内置的Json库,同时也可以设置单独的返回格式
return new JsonResult(new Student
{
NameFirst = "zhang",
AgeFirst = 333
},new JsonSerializerOptions()
{
});
7.3.0以前默认使用Newtonsoft.json。现在使用System.Text.Json。添加Microsoft.AspNetCore.Mvc.NewtonsoftJson
8.注意Microsoft.AspNetCore.Mvc.NewtonsoftJson和Newtonsoft.json是不一样的。尽量用Newtonsoft.json
指定格式
[Produces("application/json")]
强制返回Json格式的数据,可以应用在控制器,action中
特例格式化程序
程序会自动的为我们返回的数据指定格式,字符串指定为text/plain格式。但是我们删除这种指定行为
响应格式 URL 映射
客户端可以在URL中请求特定格式
[FormatFilter]
[HttpGet("{id}.{format?}")]
自定义格式化程序
就是自定义一种返回数据的类型,Content-Type。
可以设置如果没有这种格式就报错
错误处理
app.UseExceptionHandler("/error");
1.可以将开发环境中的错误处理与生产中错误处理分开
2.这个相当于全局异常处理
使用异常来修改响应
1.新建一个筛选器
2.在筛选器中判断异常是否是我们需要的类型
3.是的话就修改结果
4.需要将过滤器在Configure中注册
最后
以上就是成就保温杯为你收集整理的Asp.Net Core Web Api应用概述添加模型类添加数据库上下文注册数据库上下文构建控制器注意事项返回类型处理JSON PATCH请求格式化响应数据自定义格式化程序错误处理的全部内容,希望文章能够帮你解决Asp.Net Core Web Api应用概述添加模型类添加数据库上下文注册数据库上下文构建控制器注意事项返回类型处理JSON PATCH请求格式化响应数据自定义格式化程序错误处理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复