zoukankan      html  css  js  c++  java
  • 初始WebApi(2)

    第一部分主要介绍了什么是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 }
  • 相关阅读:
    【JMeter】if语句中不能Failure=false解决办法
    【java】method.invoke(方法底层所属对象/null,new Object[]{实际参数})
    【java设计模式】【行为模式Behavioral Pattern】模板方法模式Template Method Pattern
    【java设计模式】代理模式
    33-算法训练 安慰奶牛
    32-java 里面list的问题
    31-java中知识总结:list, set, map, stack, queue
    30-算法训练 最短路 spfa
    29-算法训练 结点选择-超时了!!!
    28-算法训练 最大最小公倍数 -贪心
  • 原文地址:https://www.cnblogs.com/hcyesdo/p/12703687.html
Copyright © 2011-2022 走看看