https://www.xin3721.com/eschool/pythonxin3721/
第一部分主要介绍了什么是WebApi,以及它是干什么的,怎么去调用后台数据等等。。。
今天就继续来学习一个新的知识。在上一篇文章中主要是介绍了一下如何根据根据Ajax去调用后台增删改查的数据。
那么,难道我们只能针对一个表的数据进行增删改查的数据吗?比如我们要进行一个登陆操作,上传照片等等。。。改怎么去实现某一特定的业务需求呢?
第一步:创建一个LoginViewModel类
1 usingSystem;2 usingSystem.Collections.Generic;3 usingSystem.Linq;4 usingSystem.Web;5
6 namespaceDemo.Models7 {8 public classLoginViewModel9 {10 public string LoginName { get; set; }11 public string LoginPwd { get; set; }12 }13 }
第二步:创建User控制器
可以看到有一个[RoutePrefix]的标识,实际上之所以能够标识也是一个特性类的作用,并且我写了一个"api/User"的参数。
这个参数有啥用呢?
我在Login方法上也做了一个[Route]的标识,注意在请求时要与[Route]设置的名称为主,不能和方法名为主!!!
这两个组合在一起就成了一个完整的路由,在调用时,可以手动根据我们自己创建的路由规则去调用后台的数据。
上一篇文章中存在RESTful语义化风格的Get、post等必须要加方法名Get作为前缀,不然无法访问。。。
在这里通过自定义路由规则就可以解决这个“死板”的问题了。。
1 usingDemo.Models;2 usingSystem;3 usingSystem.Collections.Generic;4 usingSystem.Linq;5 usingSystem.Net;6 usingSystem.Net.Http;7 usingSystem.Web.Http;8
9 namespaceDemo.Controllers10 {11 //WebApi:只管处理数据12
13 //在控制器上方加一个路由前缀来确定请求的一个控制器 RoutePrefix Prefix意为前缀
14 [RoutePrefix("api/User")]15 public classUserController : ApiController16 {17 //此处没有Restful风格语义化 所以需要自己手动指定此处需要什么样的请求
18 [HttpPost]19 //定义一个路由名称为 Login,即RouteName,这时,它会和前缀组合成一个完整的路由
20 [Route("Login")]21 public stringLogin(LoginViewModel model)22 {23 return "Ok";24 }25 [HttpGet]26 [Route("Messages")]27 publicIHttpActionResult GetMessage()28 {29 return Ok(newStudent() {30 Id=80,31 Name="及格了"
32 });33 }34
35 }36
37 }
例如:
Html代码段部分:
这里我就只写ajax部分的代码了,其他Html标签就不多赘述了。。。
主要是看url请求的地址:/api/User/Login
1
2 $.ajax({3 url: "/api/User/Login",4 type: "post",5 data: {6 LoginName: "admin",7 LoginPwd: "123"
8
9 }10
当然了,它也可以作为一个对象传递给客户端。GetMessage()方法里面
在这里创建了一个学生类:
1 usingSystem;2 usingSystem.Collections.Generic;3 usingSystem.Linq;4 usingSystem.Web;5
6 namespaceDemo.Models7 {8 public classStudent9 {10 public int Id { get; set; }11 public string Name { get; set; }12 }13 }
那怎么去理解IHttpActionResult呢?
IHttpActionResult:可以看到它是一个接口,接口代码:返回结果是HttpResponesMessage的任务。我可不可以认为这是后台数据在传递到客户端是,返回的状态码?一个状态码代表一个返回结果。
比如
return Ok() 状态码:200
NotFound() 状态码:404
return InternalServerError(new Exception("你错了")) 状态码:500
实际上这些方法都只能在IHttpActionResult中实现的。
想想接口中一般是有一个类,几个方法
如果需要验证的话可以去试试F12看看NetWork里面是否该方法对应了自己的状态码
正是该方法实现了该接口,所有才可以进行处理。
那么这里需要注意的是只有 Return Ok(),才能带数据到客户端。。。
1 usingSystem.Net.Http;2 usingSystem.Threading;3 usingSystem.Threading.Tasks;4
5 namespaceSystem.Web.Http6 {7 //
8 //摘要:9 //定义一个用于以异步方式创建 System.Net.Http.HttpResponseMessage 的命令。
10 public interfaceIHttpActionResult11 {12 //
13 //摘要:14 //以异步方式创建 System.Net.Http.HttpResponseMessage。15 //
16 //参数:17 //cancellationToken:18 //要监视的取消请求标记。19 //
20 //返回结果:21 //在完成时包含 System.Net.Http.HttpResponseMessage 的任务。
22 TaskExecuteAsync(CancellationToken cancellationToken);23 }24 }
User控制器:在这里的请求方式是Get,因为做了一个[HttpGet]的标识
1 usingDemo.Models;2 usingSystem;3 usingSystem.Collections.Generic;4 usingSystem.Linq;5 usingSystem.Net;6 usingSystem.Net.Http;7 usingSystem.Web.Http;8
9 namespaceDemo.Controllers10 {11 //WebApi:只管处理数据12
13 //在控制器上方加一个路由前缀来确定请求的一个控制器 RoutePrefix Prefix意为前缀
14 [RoutePrefix("api/User")]15 public classUserController : ApiController16 {17 //此处没有Restful风格语义化 所以需要自己手动指定此处需要什么样的请求
18 [HttpPost]19 //定义一个路由名称为 Login,即RouteName,这时,它会和前缀组合成一个完整的路由
20 [Route("Login")]21 public stringLogin(LoginViewModel model)22 {23 return "Ok";24 }25 [HttpGet]26 [Route("Messages")]27 publicIHttpActionResult GetMessage()28 {29 return Ok(newStudent() {30 Id=80,31 Name="及格了"
32 });33 }34
35 }36 }