四季该很好,你若尚在场。 --zhu
控制器类
1、ControllerBase与Controller
2、控制器类可以不显式的继承自任何类。
Action方法的异步
1、Action方法既可以同步也可以异步。
2、异步Action方法的名字一般不需要以Async结尾。
3、WebAPI中Action方法的返回值如果是普通数据类型,那么返回值就会默认被序列化为Json格式。
4、WebAPI中的Action方法的返回值同样支持IActionResult类型,不包含类型信息,因此SWagger等无法推断出类型,所以推荐使用ActionResult
public ActionResult<Person> GetPerson(int id)
{
if(id<=0)
return BadRequest("id必须正确");
else if(id==1)
return BadRequest(1,"之士",18);
else if(id==2)
return BadRequest(2,"芝士",28);
else
return NotFound("人员不存在");
}
捕捉URL占位符
1、在[HttpGet]、[HtttpPost]等中使用占位符,比如{schoolName},捕捉路径中的内容,从而供Action方法的参数使用。/Students/GetAll/school/MIT/class/001
[HttpGet("school/{schoolName}/class/{classNo}")] <=> GetStudentsBySchoolAndClass?school=MIT?class=3
2、捕捉的值会被自动赋值给Action中同名的参数;如果名字不一致,可以用[FromRoute(Name="")]
[HttpGet("school/{schoolName}/class/{classNo}")]
public Person GetStudents(string schoolName,[FromRoute(Name="classNo")] int classNum)
{
return new Person {Id=classNum+6,Name=schoolName+"学校"};
}
捕捉QueryString值
1、使用[FromQuery]来获取QueryString中的值。如果名字一致,只有为参数添加[FromQuery]即可;而如果名字不一致,[FromQuery(Name="")].
2、QueryString和Route可以混用。
[HttpPost]
public int Save(FromQuery(Name="aaa")int i,int j)
{
return i+j;
}
Json报文体
1、WebAPI的开发模式下,Json格式的请求体是主流。
2、只要声明一个模型类和Json请求的格式一致即可。
3、可以把从URL获取参数、请求报文体获取数据等混用。
[HttpPost("classId/{classId}")]
public ActionResult<long> AddNew(long classId,StudentModel s)
{
}
4、一定要设定请求头中的Content-Type为application/json,而且数据必须是合法的json格式。
其他方式
WebAPI很少用的方式:
1、从Content-Type为multipart/from-data的请求中获取数据的[FromForm]。上传文件?
2、从请求报文头中获取值的[FromHeader]。