即可通过/api/default/index访问到这个API:
但对于REST风格的API来说,它需要通过ApiController特性对Controller类型进行标记,并且通过Route特性来设置路由:
然后就可以通过HTTP谓词来访问API:
但要注意的是在ASP.NET Core中实现的REST风格的Controller,它不会再根据action方法的名称来匹配谓词,所以存在多个方法时会,那怕对方法进行了命名,但仍然会出现以下错误:
为了解决这个问题,需要通过添加谓词特性解决:
模型绑定
WebAPI中的模型绑定与MVC存在一些区别,首先当使用ApiController标记Controller类型时,如果模型绑定验证未通过,会直接返回400错误,不会执行Action方法(免去了使用!ModelState.IsValid进行判断):
执行结果:
其次使用ApiController标记的Controller在执行模型绑定时会使用默认的推断规则,该规则分别从Body、Form、Header、Query、Route、Services(它们分别对应FromBody、FromForm、FromHeader、FromQuery、FromRoute、FromServices特性)中推断获取数据并绑定,为什么说推断?
因为有一些特殊的规则:
1. FromBody用于复杂类型推断,如果不是复杂类型(如int、string等)以及特殊的内置类型(IFormCollection文档例子),则不会从Body中获取数据,除非通过[FromBody]特性指明,例子如下:
请求结果:
当使用[FormBody]指明参数数据源后可以正常访问:
注:当请求参数为简单类型时,请求体内容类型需要为application/json,内容不能为Json字符串,使用参数值作为内容即可(上图id没有提供的异常并不是因为Json格式问题,而是没有指明从body中获取数据导致的)。
2. 只能存在一个参数从Body中获取数据,如果出现多个参数时,只能保证一个参数从Body中获取数据,其它参数需要指明获取数据的位置:
该API的调用方式如下:
3. FromForm默认只推断文件(IFormFile)及文件集合类型(IFormFileCollection),其余类型默认均不会从Form中获取。
4. 使用FromForm特性时会推断multipart/form-data请求内容类型。
以上推断行为可以通过如下配置禁用: