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调用。