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

  • 相关阅读:
    机器学习基础-手写数字识别
    二进制、计算机与存储
    tmux和vim
    外包干了3个月,技术退步明显。。。。。
    C++学习:list
    2021-09-02-Servlet请求与响应
    剑指 Offer II 105. 岛屿的最大面积
    缓存一致性(cache coherency)解决方案:MESI 协议状态转换详解
    地下管线探测仪都有哪些功能-----TFN RM8500
    B站UP主发布视频,助力会员救园
  • 原文地址:https://blog.csdn.net/q__y__L/article/details/127612843