MVC+WebApi+Restful

时间:2019-09-17
本文章向大家介绍MVC+WebApi+Restful,主要包括MVC+WebApi+Restful使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Restful四个关键字 Get,Post,Put,Delete,这是重点!


创建一个WebApi,MVC模式

路由配置文件,跟Web的不是一个文件,要注意。

defaults里的默认控制器是我随手加的,对于api来说不应该有默认,要什么就给什么。

默认控制器ValueController中有

GetGetGetGetGetGetGetGetGetGetGetGetGetGetGetGetGetGetGetGetGetGetGetGetGetGetGet

无参和有一个参数的方法,根据是否传参数来确定调用谁。

在Models中建一个学生类

新建一个控制器Student

/Api/Student 访问这个控制器会返回json格式的student对象数据,很简单。

添加Action

/Api/Student/7 这样访问时会调用这个方法。为啥会找到这个id呢,因为路由配置文件里的规则中写的是id,如果我改成age

 Get方法的参数名也改成age

依然可以找到这个方法,如果两边不一致,则不会,这时需要通过get方式请求。

想访问到这个方法,需要Api/Student?name=hello这么请求

多个参数的话,可以一直累加参数

对应的是 Api/Student?name=hello&Age=4 

 需要注意的是,每个Get方法都是重载,需要注意重载规则。

那每个方法都叫Get,岂不是很不直观,无法望文生义?不是这样的。

可以 /Api/Student?address=中国北京 这样访问

Action的名字叫GetAddress,也能正常访问到,这说明,Action的重点是,"Get"这个字符串啊!

不信我把最开始的无参Get改成

用/Api/Student照样能访问。


 Post

基本一样,控制器中写一个Post

  public string Post(Student student)
        {
            return  student.Name;
        }

随手写个html页面,用ajax模拟post提交

<body>


    <script>
        $.ajax({
            url: "/Api/Student?address=地址",
            type: "get",
        }).done(function (data) {
            alert(data);
            })

        $.ajax({
            url: "/Api/Student",
            type: "post",
            data: {
                Id: 1,
                Name: "张三",
                Grade: 6
            }
        }).done(function (data) {
                alert(data);
            }).fail(function (err) {
                alert("失败了");
            })
    </script>
</body>

这样就能正常访问到这个Action


Put

控制器

public string Put(int Id,Student student)
        {
            return "Id:" + Id + ",student:" + student.Name + "-" + student.Id;
        }

入参既有int,又有student对象,怎么请求呢?

$.ajax({
            url: "/Api/Student/13",
            type: "put",
            data: {
                Id: 1,
                Name: "张三",
                Grade: 6
            }
        }).done(function (data) {
            alert(data);
        }).fail(function (err) {
            alert("失败了");
        })

很简单,各管各的,即使int Id和student对象中的Id重名,也能区分开。

输出 Id:13,student:张三-1

如果再加一个入参Name,就把

 url: "/Api/Student/13", 改成
 url: "/Api/Student/13?Name=李四",这样就行了。

Delete

跟上面没啥区别就不说了。


需要注意的是,Restful风格并不适用所有场景,有些业务逻辑情况下,你会发现,哪一种方法都不好用,例如Login,你说你用Get还是Post呢?

所以,我们可以重新定义路由规则,不走restful风格。

写一个新的控制器User

 [RoutePrefix("Api/User")]
    public class UserController : ApiController
    {
        [HttpPost]
        [Route("Login")]
        public string Login(Student student)
        {
            return "登录";
        }
    }
[RoutePrefix("Api/User")] 用来定义整个User控制器的访问格式。
[Route("Login")]则是定义某个Action
这里也可以写成
[Route("Api/User/Login")],这样外层控制器那里可以不写。
 [HttpPost]是因为Login本身不属于Restful的任何一种风格,所以我指定只能post调用。
 

原文地址:https://www.cnblogs.com/luyShare/p/11386281.html