ASP.Net Core开发(踩坑)指南 (5)

  

ASP.Net Core开发(踩坑)指南

  即可通过/api/default/index访问到这个API:

  

ASP.Net Core开发(踩坑)指南

  但对于REST风格的API来说,它需要通过ApiController特性对Controller类型进行标记,并且通过Route特性来设置路由:

  

ASP.Net Core开发(踩坑)指南

  然后就可以通过HTTP谓词来访问API:

  

ASP.Net Core开发(踩坑)指南

  但要注意的是在ASP.NET Core中实现的REST风格的Controller,它不会再根据action方法的名称来匹配谓词,所以存在多个方法时会,那怕对方法进行了命名,但仍然会出现以下错误:

  

ASP.Net Core开发(踩坑)指南

  为了解决这个问题,需要通过添加谓词特性解决:

  

ASP.Net Core开发(踩坑)指南

模型绑定

  WebAPI中的模型绑定与MVC存在一些区别,首先当使用ApiController标记Controller类型时,如果模型绑定验证未通过,会直接返回400错误,不会执行Action方法(免去了使用!ModelState.IsValid进行判断):

   

ASP.Net Core开发(踩坑)指南

  执行结果:

  

ASP.Net Core开发(踩坑)指南

  其次使用ApiController标记的Controller在执行模型绑定时会使用默认的推断规则,该规则分别从Body、Form、Header、Query、Route、Services(它们分别对应FromBody、FromForm、FromHeader、FromQuery、FromRoute、FromServices特性)中推断获取数据并绑定,为什么说推断?

  因为有一些特殊的规则:
  1. FromBody用于复杂类型推断,如果不是复杂类型(如int、string等)以及特殊的内置类型(IFormCollection文档例子),则不会从Body中获取数据,除非通过[FromBody]特性指明,例子如下:

   

ASP.Net Core开发(踩坑)指南

  请求结果:

  

ASP.Net Core开发(踩坑)指南

  当使用[FormBody]指明参数数据源后可以正常访问:

  

ASP.Net Core开发(踩坑)指南

  注:当请求参数为简单类型时,请求体内容类型需要为application/json,内容不能为Json字符串,使用参数值作为内容即可(上图id没有提供的异常并不是因为Json格式问题,而是没有指明从body中获取数据导致的)。
  2. 只能存在一个参数从Body中获取数据,如果出现多个参数时,只能保证一个参数从Body中获取数据,其它参数需要指明获取数据的位置:

  

ASP.Net Core开发(踩坑)指南

  该API的调用方式如下:

  

ASP.Net Core开发(踩坑)指南

  3. FromForm默认只推断文件(IFormFile)及文件集合类型(IFormFileCollection),其余类型默认均不会从Form中获取。
  4. 使用FromForm特性时会推断multipart/form-data请求内容类型。

  以上推断行为可以通过如下配置禁用:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpszyp.html