• Web Api的参数传递建议


     

    目录

    1.URL

    2.QueryString

     3.报文

    4.小结

       

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

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

    1. URL
    2. QueryString
    3. 报文

    下面分别介绍三种方法:

    1.URL

            URL都很熟悉了,假设有这样一个接口:

    1. [HttpGet,Route("Add")]
    2. public ActionResult<int> Add(int x,int y)
    3. {
    4. return x + y;
    5. }

    那么假设传入的参数为x=1,y=2,那么请求的链接为:

    https://localhost:7299/WeatherForecast/Add?x=1&y=2

    当然,也可以根据httpget参数定义访问模板:

    1. [HttpGet("{x}")]
    2. public ActionResult<int> SquareInt(int x)
    3. {
    4. return x * x;
    5. }

    这样访问的链接变为:

    https://localhost:7299/WeatherForecast/2

    两个参数也是一样:

    1. [HttpGet("Multiply/{x}/{y}")]
    2. public ActionResult<int> Multiply(int x,int y)
    3. {
    4. return x * y;
    5. }

    这里为了区别方法,我在参数名前加上了方法名,参数之间用斜杠隔开:

    https://localhost:7299/WeatherForecast/Multiply/2/3

     有时候你可能觉得访问的路由参数名和函数参数名不一致,为了可读性,可以通过[FromRoute()]来指定匹配的参数名:

    1. [HttpGet("Multiply/{x}/{y}")]
    2. public ActionResult<int> Multiply([FromRoute(Name = "x")]int width,
    3. [FromRoute(Name ="y")]int length)
    4. {
    5. return width*length;
    6. }

     也就是参数和路由占位符名一致时,不用指定,否则需要通过[FromRoute()]指定。

    2.QueryString

            对于通过QueryString传递的参数,使用【FromQuery】来获取值,如果操作方法的参数名字和要获取的QueryString一致,则只添加[QueryString]即可,如果不一致,则要设置FromeQuery的name属性:

            

    1. [HttpGet,Route("Cubic")]
    2. public ActionResult<int> Cubic([FromQuery]int x)
    3. {
    4. return x * x * x;
    5. }

    请求链接为:

    https://localhost:7299/WeatherForecast/Cubic?x=3

     也可以和[FromRoute()]混用:

    1. [HttpGet("Cubic/{num1}")]
    2. public ActionResult<int> Cubic([FromQuery]int x, [FromRoute(Name ="num1")]int y)
    3. {
    4. return x * x * (x+y);
    5. }

    通过Swagger还以看到, query所标记的属性是可空缺的,但是route中的是不可空缺的

     3.报文

            报文估计大家都很熟悉了,如果传入参数是一个类,那么上面两种都是不合适的,Http请求中通过Content-Type可以支持不同格式的报文体,,在Web Api中主流的报文体就是Json。

            看这样一个例子:

    1. [HttpPost,Route("AddStudent")]
    2. public ActionResult<string> AddStu(Student student)
    3. {
    4. return $"Name:{student.Name}-- {student.Id}";
    5. }
    6. 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请求,然后通过报文来传递参数。

  • 相关阅读:
    ubuntu18.04 RTX3060 rangnet++训练 bonnetal语义分割
    Tree Shaking:优化前端项目的利器
    MIT6.5830 Lab1-Go tutorial实验记录(一
    分布式 PostgreSQL 集群(Citus)官方教程 - 迁移现有应用程序
    LeetCode-剑指68-I.二叉搜索树的最近公共祖先
    泛微OA之获取每月固定日期
    CM311-3_YST_晨星MSO9385_2+8_安卓9.0_TTL免费升级固件【含教程】
    电脑怎么录音,亲身测评,让你事半功倍!
    LeetCode 0155. 最小栈
    electron 起步
  • 原文地址:https://blog.csdn.net/q__y__L/article/details/127612843