Asp.Net Core Web Api应用

概述

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中注册

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值