欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

初始WebApi(2)

程序员文章站 2022-07-02 09:19:35
第一部分主要介绍了什么是WebApi,以及它是干什么的,怎么去调用后台数据等等。。。 今天就继续来学习一个新的知识。在上一篇文章中主要是介绍了一下如何根据根据Ajax去调用后台增删改查的数据。 那么,难道我们只能针对一个表的数据进行增删改查的数据吗?比如我们要进行一个登陆操作,上传照片等等。。。改怎 ......

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

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

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

第一步:创建一个loginviewmodel类

 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"的参数。

这个参数有啥用呢?

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

这两个组合在一起就成了一个完整的路由,在调用时,可以手动根据我们自己创建的路由规则去调用后台的数据。

上一篇文章中存在restful语义化风格的get、post等必须要加方法名get作为前缀,不然无法访问。。。

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

 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 }