web api学习记录一之数据传输

web api名词解释

提供基于RESTFUL架构的web服务,通过HTTP请求方法(GET、PUT、POST、DElETE)映射到服务器端相应的ACTION方法(CRUD)

是一个框架可以轻松构建http服务覆盖广泛的客户端,包括浏览器和移动设备,webapi是在.netFramwork上构建restful程序的理想平台

web api 路由

在webapi中,默认路由机制是通过解析http请求的类型来匹配Action,也就是说WebAip默认路由不需要指定Action的名称。比如:/api/User,这个url表示匹配User控制器下的【HttpGet】方法,/api是固定必填值,这是路由的默认的解析方式。

  
public static void Register(HttpConfiguration config)

{

    // Web API 路由

    config.MapHttpAttributeRoutes();

 

    config.Routes.MapHttpRoute(

        name: "DefaultApi",

        routeTemplate: "api/{controller}/{id}",

        defaults: new { id = RouteParameter.Optional }

    );

 

mvc 和webapi路由区别

1.在mvc中默认路由机制是通过url路径来匹配Action.比如:/User/GetList,这个url

表示匹配User控制器下的GetList方法,这是MVC路由的默认解析方式。

WebApi的默认路由机制通过http请求的类型匹配Action

2.webApi的路由配置文件是WebApiConfig.cs,MVC的路由配置文件是RouteConfig.cs

3.WebApi的Controller继承自Web.http.ApiController,MVC的Controller继续自Web.Mvc.Controller

注:若Controller中有多个请求类型相同、参数相同、方法名不同的方法、那个webApi的默认路由机制就不够用了

Web api的传参数

Get请求

方法名以Get开头,WebApi会自动默认这个请求就是get请求,而如果你以其他名称开头而又不标注方法的请求方式,那么这个时候服务器虽然找到了这个方法,但是由于请求方式不确定,所以直接返回给你405——方法不被允许的错误。

1. 基础类型参数

  public class Student

    {

        public int Id { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }

        public string  Address {get;set;}

}

   $(function () {

            $.ajax({

                type:'Get',

            url: '/api/Study',

            data: { Name: 'sy',age:11},

            success: function (data, staus) {

                if (staus == "success") {

                    $('#studentID').html(data);

                   

                }

            }

        })

 

        })

[HttpGet]

        public string GetStudent(int Age, string Name)

        {

 

            return "Name:" + Name + "Age:" + Age;

 

 

        }

2.实体作为参数

get请求时,我们直接将json对象当做实体传递后台,后台是接收不到的

Get请求的时候可以在参数里面加上[FromUri]即可直接得到对象       

 

$(function () {

            $.ajax({

                type:'Get',

            url: '/api/Study',

            data: { Name: 'sy',age:11,address:"赣州" ,id:12},

            success: function (data, staus) {

                if (staus == "success") {

                    $('#studentID').html(data);

                   

                }

            }

        })

 

        })

 

        [HttpGet]

        public string GetStudent([FromUri]Student stu) {

            return stu.Id.ToString();

        }

  

 

3.数组

Post请求

  1. 基础类型参数

我们一般的通过url取参数的机制是键值对,即某一个key等于某一个value,而这里的FromBody和我们一般通过url取参数的机制则不同,它的机制是=value,没有key的概念,并且如果你写了key(比如你的ajax参数写的{NAME:"Jim"}),后台反而得到的NAME等于null

     $(function () {

            $.ajax({

                type:'Post',

            url: '/api/Study',

            data: { '': 'sy'},

            success: function (data, staus) {

                if (staus == "success") {

                    $('#studentID').html(data);

                 

                }

            }

        })

        })

  

           [HttpPost]

        public string GetStudent([FromBody]string Name) {

            return Name;

        }

多个基础类型的数据

很多的解决办法是新建一个类去包含传递的参数,感觉不太好,因为如果我们前后台每次传递多个参数的post请求都去新建一个类的话,我们系统到时候会有多少个这种参数类?

通过dynamic动态类型 contentType: 'application/json'这个要加上

  [HttpPost]

        public string GetStudent(dynamic stu) {

 

 

            return stu.Address;

 

        }

   $(function () {

            $.ajax({

                type: 'Post',

                contentType: 'application/json',

            url: '/api/Study',

            data: JSON.stringify({ Name: 'sy',Age:25,Address:"赣州"}),

            success: function (data, staus) {

                if (staus == "success") {

                    $('#studentID').html(data);

                   

                }

            }

        })

 

        })

  1. 实体作为参数

如果你指定了contentType为application/json,则必须要传递序列化过的对象;如果使用post请求的默认参数类型,则前端直接传递json类型的对象即可。

      $(function () {

            $.ajax({

                type: 'Post',

                contentType: 'application/json',

            url: '/api/Study',

            data: JSON.stringify({ Name: 'sy',Age:25,Address:"赣州"}),

            success: function (data, staus) {

                if (staus == "success") {

                    $('#studentID').html(data);

                   

                }

            }

        })

 

        })

       [HttpPost]

        public string GetStudent(Student stu) {

 

 

            return stu.Address;

 

        }

默认参数类型contentType

      $(function () {

            $.ajax({

                type: 'Post',

                url: '/api/Study',

                data: { Name: 'sy', Age: 25, Address: "赣州" },

                success: function (data, staus) {

                    if (staus == "success") {

                        $('#studentID').html(data);

 

                    }

                }

            })

 

        })

   [HttpPost]

        public string GetStudent(Student stu) {

 

 

            return stu.Address;

 

        }

实体和基础类型一起作为参数传递

 

神奇的dynamic又派上用场了

$(function () {

 

            var datas = { Name: 'sy', Age: 25, Address: "赣州" };

            $.ajax({

                type: 'Post',

                contentType: 'application/json',

            url: '/api/Study',

                data: JSON.stringify({ Name2: 'kfz', StrData: datas }),

            success: function (data, staus) {

                if (staus == "success") {

                    $('#studentID').html(data);

                   

                }

            }

        })

 

        })

   [HttpPost]

        public string GetStudent(dynamic stu)

        {

 

             var oCharging = Newtonsoft.Json.JsonConvert.DeserializeObject<Student>(Convert.ToString(stu.StrData));

            return stu.Name2  + "==="+oCharging.Name;

 

        }

 

 

数组作为参数

  $(function () {

 

            var arr = ["1", "2", "3", "4"];

            $.ajax({

                type: "post",

                url: '/api/Study',

                contentType: 'application/json',

                data: JSON.stringify(arr),

                success: function (data, status) {

 

                    $('#studentID').html(data);

                }

            });

 

        })

     [HttpPost]

        public string GetStudent(string [] stu) {

 

 

           return stu[0];

 

        }

实体集合

  $(function () {

 

            var arr = [

                { ID: "1", NAME: "fff", age: "2020" },

                { ID: "2", NAME: "sss", age: "1994" },

                { ID: "3", NAME: "xxxx", age: "1995" }

            ];

            $.ajax({

                type: "post",

                url: '/api/Study',

                contentType: 'application/json',

                data: JSON.stringify(arr),

                success: function (data, status) {

 

                    $('#studentID').html(data);

                }

            });

 

        })

          

  [HttpPost]

        public string GetStudent(List<Student> stu) {

 

 

           return stu[0].Name;

 

        }

Put请求

它和用法和post请求基本相同

Delete请求

参数传递机制和post也是基本相同

原文地址:https://www.cnblogs.com/Vinkong/p/13973241.html