Web Api的参数传递建议

 

目录

1.URL

2.QueryString

 3.报文

4.小结

   

  在进行Restful接口设计时,我们需要考虑如何给服务器传递参数。

        给服务器传递参数主要有3中方法:

  1. URL
  2. QueryString
  3. 报文

下面分别介绍三种方法:

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请求,然后通过报文来传递参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值