• WebApi


    WebApi

    1. href="javascript:void(0)"

      • 含义:让超链接去执行一个js函数,而不是跳转到一个地址,void(0)表示一个空的方法,也就是不执行js函数

      • 原理: javascript 是一个伪协议,表示url的内容通过javascript执行,void(0) 表示不作任何操作,这样会防止链接跳转到其他页面,既保留了链接样式,但不让链接执行实际的操作

      • 区别:

        1. <a href="javascript:void(0)" onClick="window.open()"><a href="#" onclick="javascript:return false;"> 作用一样,但不同浏览器会有差异

        2. <a href="javascript:void(0)"></a>点击链接后不会回到网页顶部 ,而<a href="#"></a> 点击后会回到网面顶部

      • 总结:推荐使用 href="javascript:void(0)"

      • 扩展: <a href="javascript:hanshu();"这样点击a标签就可以执行hanshu()函数了

    2. 特性

      • 每个接口都是需要加上请求的特性的 [HttpGet] / [HttpPost]

      • [Route("重命名")],注意重命名的开头不能是/

        请求时的url = /重命名就相当于 /Control/Action

        --------后台
              [Route("z")]//只是举例,一般不用这种名字
              [HttpPost]
               public string PostRouteTest([FromBody]string name)
              {
                   return "用Route实现Post带参请求" + name;
              }
        -------前台
        function PostRouteTest() {
               $.ajax({
                   url: "/z",
                   type:"post",
                   data: { "": "王旻" },
                   success: function (res) {
                       alert(res);
                  }
              })
          }
      • [RoutePrefix] 搭配[Route]

        [RoutePrefix("前缀名")] 只是自定义路由的前缀,定义在控制器上,而[Route("后缀")]是加在需要的动作方法上,前缀+后缀是新的清流链接,注意:同上,前后缀前不能有/

        -------后台
          [RoutePrefix("myapi/Teacher")]
           public class TeacherController : ApiController
          {
              [Route("GetTest")]
               public string GetTest()
              {
                   return "RoutePrefix测试";
              }
          }
        -------前台
        <a href="/myapi/Teacher/GetTest">Prefix测试</a>
      • [Route()] 实现约束

        可以实现对url参数的约束(如范围约束等等),具体可上网查询

         ----后台
              [Route("Constraint/{age:int=0}")]//约束age必须为int,否则访问不到
              [HttpGet]
               public string Constraint(int age)
              {
                   return "路由验证";
              }
        ------前台
        <a href='/myapi/Teacher/Constraint?age=24'>路由验证测试</a>

         

    3. Post请求注意点

      • 参数前面必须加 [FromBody]

      • 如果只有一个参数,那么只能用空字符来传值给后台

         -------后台
              [HttpPost]
               public string PostWithOneParaTest([FromBody]string name)
              {
                   return "Post带一个参数测试" + name;
              }
        --------前台
           function postWithOneParaTest() {
               $.post("/myapi/Course/PostWithOneParaTest", { "": "王旻" }, function (res) { alert(res) });
          }
      • 如果有多个参数,那么需要把多个参数字段封装到一个对象中,然后对象作参数接收值使用

        --------后台
              [HttpPost]
               public string PostWithMoreParaTest([FromBody]Models.Person person)
              {
                   return "Post带多个参数测试" + person.Name + person.Age;
              }
        -------前台
           function postWithMoreParaTest() {
               $.post("/myapi/Course/PostWithMoreParaTest", { Name: "王旻", Age: 24 }, function (res) { alert(res) });
          }

         

    4. Get请求注意点

      • Get请求参数可以映射进对象中,但需要在对象参数前加 [FromUri]

        -------后台
              [HttpGet]
               public string GetTestModel([FromUri]Models.Person person)
              {
                   string name1 = System.Web.HttpContext.Current.Request.QueryString["Name"];//取值方式一
                   string name2 = System.Web.HttpContext.Current.Request.Params["Name"];//取值方式二
                   return "Get测试对象" + person.Name;
              }
        --------前台
        <a href='/myapi/Course/GetTestModel?Name="王旻"'>Get测试Model</a>
      • 可以同时映射多个对象

        -------后台
              [HttpGet]
               public string GetTestMoreModel([FromUri]Models.Person person,[FromUri]Models.Score score)
              {
                   string name1 = System.Web.HttpContext.Current.Request.QueryString["Name"];
                   int count = Convert.ToInt32(System.Web.HttpContext.Current.Request.Params["Count"]);
                   return person.Name + score.Count;
              }
        -------前台
        <a href='/myapi/Course/GetTestMoreModel?Name="王旻"&Count=22'>Get测试多个Model</a>
      • 注意无法映射嵌套的参数对象

      • Get请求中,在省略[HttpGet]特性的情况下,可以根据方法名称中的关键字识别Get请求,注意这个Get关键字必须放在方法命名的开头才行

        ----后台
           public string GetPersonByJson(string personJson)
              {
                   Models.Person person = Newtonsoft.Json.JsonConvert.DeserializeObject<Models.Person>(personJson);//JSON字符串转对象
                   return person.Name + person.Age;
              }
        -----前台
           function getPersonByJson() {
               var jsonResult={Name:"王旻",Age:24};
               var info=JSON.stringify(jsonResult);
               $.get("/myapi/Course/GetPersonByJson", { personJson: info }, function (res) { alert(res) });
          }

         

    5. 接收JSON字符串,并转化成实体对象

      -------后台
      [HttpGet]
             public string GetPersonByJson(string personJson)
            {
                 Models.Person person = Newtonsoft.Json.JsonConvert.DeserializeObject<Models.Person>(personJson);//JSON字符串转对象
                 return person.Name + person.Age;
            }

            [HttpPost]
             public string PostPersonByJson([FromBody]string personJson)
            {
                 Models.Person person = Newtonsoft.Json.JsonConvert.DeserializeObject<Models.Person>(personJson);//JSON字符串转对象
                 return person.Name + person.Age;
            }

      --------前台
         function getPersonByJson() {
             var jsonResult={Name:"王旻",Age:24};
             var info=JSON.stringify(jsonResult);
             $.get("/myapi/Course/GetPersonByJson", { personJson: info }, function (res) { alert(res) });
        }

         function postPersonByJson() {
             var jsonResult = { Name: "王旻", Age: 24 };
             var info = JSON.stringify(jsonResult);//JSON对象转JSON字符串
             $.post("/myapi/Course/PostPersonByJson", { "": info }, function (res) { alert(res) });
        }
    6. 响应返回集合对象

      -------后台
          [HttpGet]
             public List<Models.Person> GetPersonList()
            {
                 return new List<Models.Person>(){
                     new Models.Person(){Name="王旻",Age=24},
                     new Models.Person(){Name="李大",Age=22}
                };
            }

      -------前台
        function getPersonList() {
             $.get("/myapi/Course/GetPersonList", function (res) {
                 alert(res);
                 jQuery.each(res, function (i, item) {            
                     alert( i+1+ "次" + item.Name + item.Age);
                });
            });
        }

       

    7. 基于dynamic实现多个参数请求

      • 扩展知识点

        1. contentType含义:ajax请求中有可选参数contentType,设置的是请求参数的传输格式。

          Content-Type: application/x-www-form-urlencoded; charset=UTF-8,此为默认不设置的情况下

          它表示的含义是按照表单提交的方式传值,相当于一一映射进后台接收参数中( key - 属性),如果用对象接收参数的话,必须明确对象的类型,

          请求中的 Request Payload 格式为 Name:王旻 Age:24

           

          Content-Type:application/json; charset=utf-8 此为设置contentType:'application/json'的情况下

          它表示的含义是将参数以JSON格式传到后台,因此后台用 dynamic类型将JSON转换成对象格式输出对应的属性值即可

          请求中的 Request Payload 格式为 {Name:"王旻",Age:10}

          注意:

          • 如果用 JSON 格式,就要在 data 中用 JSON.stringify 将对象转为 Json字符串 传过去,后台可以通过对象或者dynamic类型来映射值,但是无法映射简单的参数了(string ,int)

          • 如果是一般Form格式,就不用转,但是后台的参数(无论是简单参数/还是对象)都需要与前台的传参数匹配

          • 如果是映射嵌套的对象,我们推荐使用 JSON 格式,Form格式传参不适合映射嵌套复杂的对象

          • 简单地说,前台传来JSON格式,后台服务器会转成JSON(Newtonsoft.Json.Linq.JObject类型)对象

            如果后台接收参数是实体对象,那么会根据key和属性一一映射

            如果用dynamic类型来接收,可以直接通过JSON对象输出

            也可以直接用JObject来接收,但是比较死板,还是建议用dynamic

        2. 使用dynamic搭配Json格式

          将传来的JSON格式数据转换成动态类型对象,只要此对象的属性和前台传的json的key一致即可,即使是嵌套的json数据也可以这样操作,可谓方便至极

          --------后台

                一般的JSON格式搭配dynamic
                [HttpPost]
                 public string PostPersonByDynamic(dynamic para )
                {
                     string name = para.nameInfo;
                     int age = para.ageInfo;
                     return name+age;
                }

                嵌套复杂的JSON格式搭配dynamic
                [HttpPost]
                 public string PostPersonByDynamic(dynamic para )
                {
                     string name = para.nameInfo;
                     int age = para.ageInfo.a;
                     return name+age;
                }

          -------前台
             function postPersonByDynamic() {
                 $.ajax({
                     url: "/myapi/Course/PostPersonByDynamic",
                     type: "post",
                     data: JSON.stringify({nameInfo:"王旻",ageInfo:10}),
                     contentType:'application/json',
                     success: function (res) {
                         alert(res);
                    }
                })
            }
             

             function postPersonByDynamic() {
                 $.ajax({
                     url: "/myapi/Course/PostPersonByDynamic",
                     type: "post",
                     data: JSON.stringify({ nameInfo: "王旻", ageInfo: {a:1,b:"w"}}),
                     contentType:'application/json',
                     success: function (res) {
                         alert(res);
                    }
                })
            }


           嵌套复杂的JSON格式搭配嵌套对象

          -------后台
                 public class Sudent
                {
                 public Person PersonInfo { get; set; }

                 public Score ScoreInfo { get; set; }
                }
               
                [HttpPost]
                 public string PostPersonByDynamic([FromBody]Models.Sudent para)
                {
                     string name = para.PersonInfo.Name;
                     int age = para.ScoreInfo.Count;
                     return name+age;
                }
          --------前台
          function postPersonByDynamic() {
                 $.ajax({
                     url: "/myapi/Course/PostPersonByDynamic",
                     type: "post",
                     data: JSON.stringify({ PersonInfo: {Name:"王旻",Age:22}, ScoreInfo: {Count:22}}),
                     contentType:'application/json',
                     success: function (res) {
                         alert(res);
                    }
                })
            }
          ------后台
          嵌套复杂的JSON对象转实体对象类型
                [HttpPost]
                 public string PostPersonByDynamic(dynamic para)
                {
                    //para是JSON对象(JObejct)
                     string name = para.PersonInfo.Name;
                     int age = para.ScoreInfo.Count;

                     var paraTostring = para.ToString();
                     var personInfoTostring=para.PersonInfo.ToString();//拿到嵌套对象的json字符串
                    //方式一 Json字符串转对象
                     Models.Sudent student = Newtonsoft.Json.JsonConvert.DeserializeObject<Models.Sudent>(para.ToString());
                   
                    //方式而 Json对象转实体对象
                     Newtonsoft.Json.Linq.JObject jCourse = para;
                     Models.Sudent student1 = jCourse.ToObject<Models.Sudent>();//将JObejct转换成具体的实体对象
                     var personInfo=para.PersonInfo;
                     
                     return name + age + student.PersonInfo.Name;
                }

          -----前台
            function postPersonByDynamic() {
                 $.ajax({
                     url: "/myapi/Course/PostPersonByDynamic",
                     type: "post",
                     data: JSON.stringify({ PersonInfo: {Name:"王旻",Age:22}, ScoreInfo: {Count:22}}),
                     contentType:'application/json',
                     success: function (res) {
                         alert(res);
                    }
                })
            }
          -----后台
          用JObject实体对象接收JSON格式,如果只想转嵌套的实体对象,那是无法做到的,para.Person会报红线,除非用动态类型接收参数然后.属性来转,可参照上方方法
          [HttpPost]
                 public string PostPersonByDynamic(Newtonsoft.Json.Linq.JObject para)
                {        
                     Models.Sudent student1 = para.ToObject<Models.Sudent>();//将JObejct转换成具体的实体对象                  
                     return student1.PersonInfo.Name;
                }
          -----前台
             function postPersonByDynamic() {
                 $.ajax({
                     url: "/myapi/Course/PostPersonByDynamic",
                     type: "post",
                     data: JSON.stringify({ PersonInfo: {Name:"王旻",Age:22}, ScoreInfo: {Count:22}}),
                     contentType:'application/json',
                     success: function (res) {
                         alert(res);
                    }
                })
            }
    8. 数组作参数接收前台请求的数组参数

      ------后台
          [HttpPost]
            public string ArrayPost(string[] array)
            {
                return array[0];
            }
      ------前台
        function array() {
             var arrayInfo = ["王旻", "小弟"];
             $.ajax({
                 url: "/myapi/Course/ArrayPost",
                 type:"post",
                 contentType: "application/json",
                 data: JSON.stringify(arrayInfo),
                 success: function (res) {
                     alert(res);
                }
            })
        }
    9. 集合作参数接收前台的JSON请求

      ------后台

            [HttpPost]
             public string ListPost(List<Models.Sudent> list)
            {
                 return list[0].PersonInfo.Name + list[1].ScoreInfo.Count;
            }

      -----前台
         function listTest() {
             var list = [
                { PersonInfo: { Name: "王旻", Age: 25 }, ScoreInfo: { Count: 22 } },
            { PersonInfo: { Name: "流费", Age: 25 }, ScoreInfo: { Count: 27 } }
            ];
             $.ajax({
                 type: "post",
                 url: "/myapi/Course/ListPost",
                 contentType: "application/json",
                 data: JSON.stringify(list),
                 success: function (res) {
                     alert(res);
                }
            })
        }

       

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    2018.11.5 Nescafe26 T1 小猫爬山
    2018.10.30 NOIp模拟赛T2 数字对
    2018.10.30 NOIp模拟赛 T1 改造二叉树
    2018/7/16 YMOI模拟 NOIP2013D2T3华容道
    数据结构实验
    我的第一个博客
    题解 P5035 【金坷垃】
    题解 P5036 【随机生成树】
    题解 P5037 【抓捕】
    题解 P1328 【生活大爆炸版石头剪刀布】
  • 原文地址:https://www.cnblogs.com/wang-min/p/10891178.html
Copyright © 2020-2023  润新知