WebApi(2.0) 第一节

1.Restful风格:

Get/Post/Put/Delete 语义关键字必须再方法最前面,譬如GetStudent;

不能在其他部分,譬如HelloGetStudent、StudentGet; 方法名称也可以只包含语义关键字,譬如 public void Get(){};

2.定制路由-路由特性

RoutePrefix:[RoutePrefix(prefix: "api/UserLogin")]     路由前缀

[Route(template: "AjaxLogin")]                                      路由模板

通过定制路由前缀和路由模板,可以不通过Restful风格调用后台,实现类似MVC的action调用方式

namespace WebApplication1.Controllers
{
    [RoutePrefix(prefix: "api/UserLogin")]
    public class UserLoginController : ApiController
    {
        [Route(template: "Login")]
        [HttpGet]
        public string Login([FromUri] UserInfo userinfo)
        {
            return "UrlOK";
        }

        [Route(template: "AjaxLogin")]
        [HttpPost]
        public string AjaxLogin([FromBody] UserInfo userinfo)
        {
            return "AjaxOK";
        }
    }
}

启用调用方式有

1.Url:get方式调用:http://localhost:8222/api/UserLogin/Login?userinfo="{UserName:zhangsan,UserPwd:123}",参数要保证与方法Login一致;以Url方式调用,方法需要加上特性【HttpGet】,方法参数需要加上特性【FromUri】;

2.Ajax:post方式调用,如下代码;以Ajax方式调用,方法可以加上(非必须,ajax get方法也可以请求) 特性【HttpPost】,方法参数可以加上(非必须,ajax get方法也可以请求) 特性【FromBody】

$.ajax({
            url: "/api/UserLogin/AjaxLogin",
            type: "post",
            data: {
                UserName: "wangwu",
                UserPwd: "123"
            }
        }).done(function (data) {
            console.log(data);
        })

3.关于请求参数

   3.1 路由请求规则

namespace WebApplication1.Controllers
{
    public class StudentsController : ApiController
    {
        public string Get()
        {
            return "默认的get方法";
        }

        public string Get(string name)
        {
            return "您输入的参数name为" + name;
        }

        public string GetAddress1(string address2)
        {
            return "您输入的地址参数address为" + address2;
        }
    }
}

        3.1.1 如上路由,只有请求地址http://localhost:8222/api/Students?address2=zhangsan才有效,注意QueryString里面是根据【参数名称:address2】找对应的action,不是【函数名称Address1】;

        3.1.2 或者使用ajax请求如下,注意webapi的路由规则为api/{controller}/{id},没有{action};MVC的路由规则为{controller}/{action}/{id}{action};找不到对应的参数名就会寻找默认的Get方法,注意如果都是Get请求,不能有相同的参数名称,否则会报错:ExceptionMessage: "找到了与该请求匹配的多个操作】

$.ajax({
            url: "/api/Students",
            type: "get",
            data: {
                name: "123"
            }
        }).done(function (data) {
            console.log(data);
        })

    3.2 Get/Post请求参数

        3.2.1 Get请求

       function btnLogin() {    //单参数传值
            var name = document.getElementById("loginName").value;
            var pwd = document.getElementById("loginPwd").value;

            $.ajax({
                url: "../api/Values/LoginGetJson",
                type: "get",
                data: {
                    "model": JSON.stringify(new Object({
                        UserName: name,
                        UserPwd: pwd
                    }))
                }, success: function (data) {
                    console.log("LoginGetJson:" + data);
                }
                , error: function (msg) {
                    console.log("LoginGetJson:" + msg.responseJSON.ExceptionMessage);
                }
            })

            $.ajax({    //多参数传值
                url: "../api/Values/LoginGetMultipleParam",
                type: "get",
                data: {
                    UserName: name,
                    UserPwd: pwd
                }, success: function (data) {
                    console.log("LoginGetMultipleParam:" + data);
                }
                , error: function (msg) {
                    console.log("LoginGetMultipleParam:" + msg.responseJSON.ExceptionMessage);
                }
            })

            $.ajax({    //对象传值
                url: "../api/Values/LoginGetObj",
                type: "get",
                data: {
                    UserName: name,
                    UserPwd: pwd
                }, success: function (data) {
                    console.log("LoginGetObj:" + data);
                }
                , error: function (msg) {
                    console.log("LoginGetObj:" + msg.responseJSON.ExceptionMessage);
                }
            }) 
        [Route("LoginGetJson")]    //单参数传值
        [HttpGet]
        public string LoginGetJson(string model)
        {
            try
            {
                UserViewModel userModel = JsonConvert.DeserializeObject<UserViewModel>(model);
                if (userModel.UserName.Length >= 2 && userModel.UserPwd.Equals("123456"))
                {
                    return "true";
                }
                return "false:账号密码校验失败";
            }
            catch (Exception ex)
            {
                return "false:" + ex.Message;
            }
        }

        [Route("LoginGetMultipleParam")]    //多参数传值
        [HttpGet]
        public string LoginGetMultipleParam(string userName, string userPwd)
        {
            try
            {
                if (userName.Length >= 2 && userPwd.Equals("123456"))
                {
                    return "true";
                }
                return "false:账号密码校验失败";
            }
            catch (Exception ex)
            {
                return "false:" + ex.Message;
            }
        }

        [Route("LoginGetObj")]    //对象传值
        [HttpGet]
        public string LoginGetObj([FromUri] UserViewModel model)
        {
            try
            {
                if (model.UserName.Length >= 2 && model.UserPwd.Equals("123456"))
                {
                    return "true";
                }
                return "false:账号密码校验失败";
            }
            catch (Exception ex)
            {
                return "false:" + ex.Message;
            }
        }

        3.2.2 Post请求

        [Route("LoginPostJson")]    //单参数传值
        [HttpPost]
        public string LoginPostJson([FromBody] string model)
        {
            try
            {
                UserViewModel userModel = JsonConvert.DeserializeObject<UserViewModel>(model);
                if (userModel.UserName.Length >= 2 && userModel.UserPwd.Equals("123456"))
                {
                    return "true";
                }
                return "false:账号密码校验失败";
            }
            catch (Exception ex)
            {
                return "false:" + ex.Message;
            }
        }

        [Route("LoginPostMultipleParam")]    //多参数传值(无法实现)
        [HttpPost]
        public string LoginPostMultipleParam([FromBody] string userName, [FromBody] string userPwd)
        {
            try
            {
                if (userName.Length >= 2 && userPwd.Equals("123456"))
                {
                    return "true";
                }
                return "false:账号密码校验失败";
            }
            catch (Exception ex)
            {
                return "false:" + ex.Message;
            }
        }

        [Route("LoginPostObj")]    //对象传值
        [HttpPost]
        public string LoginPostObj(UserViewModel model)
        {
            try
            {
                if (model.UserName.Length >= 2 && model.UserPwd.Equals("123456"))
                {
                    return "true";
                }
                return "false:账号密码校验失败";
            }
            catch (Exception ex)
            {
                return "false:" + ex.Message;
            }
        }

        [Route("LoginPostDynamic")]    //动态类传值
        [HttpPost]
        public string LoginPostDynamic(dynamic model)
        {
            try
            {
                if (((string)model.UserName).Length >= 2 && ((string)model.UserPwd).Equals("123456"))
                {
                    return "true";
                }
                return "false:账号密码校验失败";
            }
            catch (Exception ex)
            {
                return "false:" + ex.Message;
            }
        }
           $.ajax({    //单参数传值
                url: "../api/Values/LoginPostJson",
                type: "post",
                data: {
                    "": JSON.stringify(new Object({
                        UserName: name,
                        UserPwd: pwd
                    }))
                }, success: function (data) {
                    console.log("LoginPostJson:" + data);
                }
                , error: function (msg) {
                    console.log("LoginPostJson:" + msg.responseJSON.ExceptionMessage);
                }
            })

            $.ajax({    //多参数传值(无法实现)
                url: "../api/Values/LoginPostMultipleParam",
                type: "post",
                data: {
                    "": name,
                    "": pwd
                }, success: function (data) {
                    console.log("LoginPostMultipleParam:" + data);
                }
                , error: function (msg) {
                    console.log("LoginPostMultipleParam:" + msg.responseJSON.ExceptionMessage);
                }
            })

            $.ajax({    //对象传值
                url: "../api/Values/LoginPostObj",
                type: "post",
                data: {
                    UserName: name,
                    UserPwd: pwd
                }, success: function (data) {
                    console.log("LoginPostObj:" + data);
                }
                , error: function (msg) {
                    console.log("LoginPostObj:" + msg.responseJSON.ExceptionMessage);
                }
            })

            $.ajax({    //动态类传值
                url: "../api/Values/LoginPostDynamic",
                type: "post",
                contentType:"application/json",
                data: JSON.stringify(new Object({
                    "UserName": name,
                    "UserPwd": pwd
                })), success: function (data) {
                    console.log("LoginPostDynamic:" + data);
                }
                , error: function (msg) {
                    console.log("LoginPostDynamic:" + msg.responseJSON.ExceptionMessage);
                }
            })

        3.2.3 总结:

            3.2.3.1 Get请求支持  单参数传值 / 多参数传值 / 对象传值;Post请求支持  单参数传值 / 对象传值 / 动态类传值;Get不支持动态类传值,如果实现了其实也是跟单参数string传值一样,在后台做了JsonConvert.DeserializeObject反序列化操作;

            3.2.3.2 Get请求的对象传值,在后台参数加了特性[FromUrl]Post请求的单参数传值,在后台参数加了特性[FromBody];个人理解非对象类基类型参数默认从Url拿值,对象类参数默认从Body拿值,否则需要特殊申明;

4.其他

4.1 不能直接访问根目录下Views文件夹里面的文件(静态文件);

      需要在Views文件夹下的web.config中配置(如果需要添加CSS文件,则另加一行,类似JS的配置)

    <remove name="BlockViewHandler"/>
    <add name="js" verb="GET,HEAD" path="*.js" type="System.Web.StaticFileHandler" />

原文地址:https://www.cnblogs.com/guaguadache/p/14713511.html