初始WebApi(2)

第一部分主要介绍了什么是WebApi,以及它是干什么的,怎么去调用后台数据等等。。。javascript

今天就继续来学习一个新的知识。在上一篇文章中主要是介绍了一下如何根据根据Ajax去调用后台增删改查的数据。java

那么,难道咱们只能针对一个表的数据进行增删改查的数据吗?好比咱们要进行一个登录操做,上传照片等等。。。改怎么去实现某一特定的业务需求呢?ajax

第一步:建立一个LoginViewModel类api

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 
 6 namespace Demo.Models
 7 {
 8     public class LoginViewModel
 9     {
10         public string LoginName { get; set; }
11         public string LoginPwd { get; set; }
12     }
13 }

第二步:建立User控制器异步

能够看到有一个[RoutePrefix]的标识,实际上之因此可以标识也是一个特性类的做用,而且我写了一个"api/User"的参数。post

这个参数有啥用呢?学习

我在Login方法上也作了一个[Route]的标识,注意在请求时要与[Route]设置的名称为主,不能和方法名为主!!!url

这两个组合在一块儿就成了一个完整的路由,在调用时,能够手动根据咱们本身建立的路由规则去调用后台的数据。spa

上一篇文章中存在RESTful语义化风格的Get、post等必需要加方法名Get做为前缀,否则没法访问。。。code

在这里经过自定义路由规则就能够解决这个“死板”的问题了。。

 1 using Demo.Models;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Net;
 6 using System.Net.Http;
 7 using System.Web.Http;
 8 
 9 namespace Demo.Controllers
10 {
11     //WebApi:只管处理数据
12 
13     //在控制器上方加一个路由前缀来肯定请求的一个控制器 RoutePrefix Prefix意为前缀
14     [RoutePrefix("api/User")]
15     public class UserController : ApiController
16     {
17         //此处没有Restful风格语义化 因此须要本身手动指定此处须要什么样的请求
18         [HttpPost]
19         //定义一个路由名称为 Login,即RouteName,这时,它会和前缀组合成一个完整的路由
20         [Route("Login")]
21         public string Login(LoginViewModel model)
22         {
23             return "Ok";
24         }
25         [HttpGet]
26         [Route("Messages")]
27         public IHttpActionResult GetMessage()
28         {
29             return Ok(new Student() { 
30                 Id=80,
31                 Name="及格了"
32             });
33         }
34         
35     }
36     
37 }

例如:

Html代码段部分:

这里我就只写ajax部分的代码了,其余Html标签就很少赘述了。。。

主要是看url请求的地址:/api/User/Login

 1 <script type="text/javascript">
 2 $.ajax({
 3             url: "/api/User/Login",
 4             type: "post",
 5             data: {
 6                 LoginName: "admin",
 7                 LoginPwd: "123"
 8 
 9             }
10 <script>

固然了,它也能够做为一个对象传递给客户端。GetMessage()方法里面

在这里建立了一个学生类:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 
 6 namespace Demo.Models
 7 {
 8     public class Student
 9     {
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 using System.Net.Http;
 2 using System.Threading;
 3 using System.Threading.Tasks;
 4 
 5 namespace System.Web.Http
 6 {
 7     //
 8     // 摘要:
 9     //     定义一个用于以异步方式建立 System.Net.Http.HttpResponseMessage 的命令。
10     public interface IHttpActionResult
11     {
12         //
13         // 摘要:
14         //     以异步方式建立 System.Net.Http.HttpResponseMessage。
15         //
16         // 参数:
17         //   cancellationToken:
18         //     要监视的取消请求标记。
19         //
20         // 返回结果:
21         //     在完成时包含 System.Net.Http.HttpResponseMessage 的任务。
22         Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);
23     }
24 }

User控制器:在这里的请求方式是Get,由于作了一个[HttpGet]的标识

 1 using Demo.Models;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Net;
 6 using System.Net.Http;
 7 using System.Web.Http;
 8 
 9 namespace Demo.Controllers
10 {
11     //WebApi:只管处理数据
12 
13     //在控制器上方加一个路由前缀来肯定请求的一个控制器 RoutePrefix Prefix意为前缀
14     [RoutePrefix("api/User")]
15     public class UserController : ApiController
16     {
17         //此处没有Restful风格语义化 因此须要本身手动指定此处须要什么样的请求
18         [HttpPost]
19         //定义一个路由名称为 Login,即RouteName,这时,它会和前缀组合成一个完整的路由
20         [Route("Login")]
21         public string Login(LoginViewModel model)
22         {
23             return "Ok";
24         }
25         [HttpGet]
26         [Route("Messages")]
27         public IHttpActionResult GetMessage()
28         {
29             return Ok(new Student() { 
30                 Id=80,
31                 Name="及格了"
32             });
33         }
34         
35     }
36 }
相关文章
相关标签/搜索