目录
在进行Restful接口设计时,我们需要考虑如何给服务器传递参数。
给服务器传递参数主要有3中方法:
- URL
- QueryString
- 报文
下面分别介绍三种方法:
1.URL
URL都很熟悉了,假设有这样一个接口:
[HttpGet,Route("Add")]
public ActionResult<int> Add(int x,int y)
{
return x + y;
}
那么假设传入的参数为x=1,y=2,那么请求的链接为:
https://localhost:7299/WeatherForecast/Add?x=1&y=2
当然,也可以根据httpget参数定义访问模板:
[HttpGet("{x}")]
public ActionResult<int> SquareInt(int x)
{
return x * x;
}
这样访问的链接变为:
https://localhost:7299/WeatherForecast/2
两个参数也是一样:
[HttpGet("Multiply/{x}/{y}")]
public ActionResult<int> Multiply(int x,int y)
{
return x * y;
}
这里为了区别方法,我在参数名前加上了方法名,参数之间用斜杠隔开:
https://localhost:7299/WeatherForecast/Multiply/2/3
有时候你可能觉得访问的路由参数名和函数参数名不一致,为了可读性,可以通过[FromRoute()]来指定匹配的参数名:
[HttpGet("Multiply/{x}/{y}")]
public ActionResult<int> Multiply([FromRoute(Name = "x")]int width,
[FromRoute(Name ="y")]int length)
{
return width*length;
}
也就是参数和路由占位符名一致时,不用指定,否则需要通过[FromRoute()]指定。
2.QueryString
对于通过QueryString传递的参数,使用【FromQuery】来获取值,如果操作方法的参数名字和要获取的QueryString一致,则只添加[QueryString]即可,如果不一致,则要设置FromeQuery的name属性:
[HttpGet,Route("Cubic")]
public ActionResult<int> Cubic([FromQuery]int x)
{
return x * x * x;
}
请求链接为:
https://localhost:7299/WeatherForecast/Cubic?x=3
也可以和[FromRoute()]混用:
[HttpGet("Cubic/{num1}")]
public ActionResult<int> Cubic([FromQuery]int x, [FromRoute(Name ="num1")]int y)
{
return x * x * (x+y);
}
通过Swagger还以看到, query所标记的属性是可空缺的,但是route中的是不可空缺的
3.报文
报文估计大家都很熟悉了,如果传入参数是一个类,那么上面两种都是不合适的,Http请求中通过Content-Type可以支持不同格式的报文体,,在Web Api中主流的报文体就是Json。
看这样一个例子:
[HttpPost,Route("AddStudent")]
public ActionResult<string> AddStu(Student student)
{
return $"Name:{student.Name}-- {student.Id}";
}
public record Student(string Name,int Id);
在swagger页面可以看到类Student被翻译成json。
4.小结
通过URL传递更符合Restful规范,但是如果传递的参数太多或者内容太长的话,通过URL传递的方式就不大适合。对于WebApi的参数请求,对于保存更新类的请求一般使用POST、PUT,把全部的参数放到报文体中。对于DELETE请求,要传递的参数就是一个资源ID,因此把参数放到QueryString中即可,对于Get请求,一般的参数内容都不会太长,因此同一通过QueryString传递参数就可以;当然对于极少数参数内容超过URL限制的请求,由于GET、PUT请求都是幂等的,因此把请求改成通过Put请求,然后通过报文来传递参数。