WebApi学习一初步认识与创建项目

1 篇文章 0 订阅

一、WebAPI定义

给前端提供数据的框架

Restful格式的数据提供方式
Post 提交数据(增)
Get 得到数据(查)
Put 修改数据(改)
Delete 删除数据(删)
常见的为前两个,这四个就代表了增删改查.
但有些企业可能仅用Post和Get两种方式,Get用于查询,将所有的增改删都使用Post方式处理。

二、WebAPI创建

首先打开VS,我这里用的VS版本为Visual Studio 2017。
创建WebAPI
在这里插入图片描述
选择Web API 点击确定123
创建完成后,可以看到项目自动生成了以MVC结构为基础的项目文件。
一般WebAPI只有Model和Controller,VS在这里默认加上了一个提示页面View。
在这里插入图片描述
然后直接按F5运行,会得到一个默认页面,点击API。
在这里插入图片描述
出现默认的四种请求方式,Get Post Put Delete
在这里插入图片描述
这个页面对应地方在项目中Controllers文件夹下的两个控制器上。
默认的两个控制器因为其父类不同,作用也不同。
在这里插入图片描述

HomeController继承于System.Web.Mvc.Controller
System.Web.Mvc.ControllerMVC控制器

 public class HomeController : Controller //MVC控制器
    {
        public ActionResult Index()
        {
            ViewBag.Title = "Home Page";

            return View();
        }
    }

ValuesController继承于System.Web.Http.ApiController
System.Web.Http.ApiControllerWebAPI控制器

  public class ValuesController : ApiController //API控制器
    {
        // GET api/values
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
        // GET api/values/5
        public string Get(int id)
        {
            return "value";
        }
        // POST api/values
        public void Post([FromBody]string value)
        {
        }
        // PUT api/values/5
        public void Put(int id, [FromBody]string value)
        {
        }
        // DELETE api/values/5
        public void Delete(int id)
        {
        }
    }

先看WebAPI控制器,在ValuesController中,代码包含了默认五个定义方法,其中get方式包含了两种,一种为不带参数请求,一种为带参数请求。

 public class ValuesController : ApiController //API控制器
   {
       // GET api/values   系统默认配置的地址
       public IEnumerable<string> Get() //以Get不带参数请求,程序执行此处
       {
           return new string[] { "value1", "value2" };
       }
       // GET api/values/5 系统默认配置的地址
       public string Get(int id) //以Get带参数请求,程序执行此处
       {
           return "value";
       }
       // POST api/values 系统默认配置的地址
       public void Post([FromBody]string value) //以Post请求,程序执行此处
       {
       }
       // PUT api/values/5 系统默认配置的地址
       public void Put(int id, [FromBody]string value) //以Put请求,程序执行此处
       {
       }
       // DELETE api/values/5 系统默认配置的地址
       public void Delete(int id)  //以Delete请求,程序执行此处
       {
       }
   }

接下来设置断点,F5进行调试,模拟请求测试进行验证。
输入注释中默认给的地址栏(即方法上//GET api/values 这个就是默认系统配置的地址)
在这里插入图片描述
可以看到进入了Get方法并返回了一个xml格式的value1和value2在这里插入图片描述在这里插入图片描述可以看到进入了Get带参数的方法,并返回了value在这里插入图片描述
其他请求方式不再一一列举。
这里有些朋友会问,这个API的地址是系统默认的,那怎么样才能修改成自定义的呢?这个留到后面介绍App_Start文件夹时再进行阐述。
在了解清楚WebAPI控制器机制后,我们自定义一个控制器,感受一下流程。
右键Controllers—点击添加—选择控制器
在这里插入图片描述
选择WebAPI2控制器
在这里插入图片描述
弹出控制器的命名,这里重点注意系统默认阴影部分Default这里,代表系统只允许我们修改Default Controller中的Default,若将后面的Controller改动,则系统将不认
在这里插入图片描述
我建了一个Books的控制器,继承于ApiController,它是一个WebAPI的控制器,并写了一个Get方法。

 public class BooksController : ApiController //WebAPI的控制器
    {
     public string Get()
        {
            return "CLR Via C#";
        }
    }

然后进行访问测试。
按F5启动项目,地址栏输入http://localhost:xxxxx…这里有朋友要问了,地址栏端口号后面应该输入什么?
上面谈到,刚刚系统默认的ValuesController控制器注释上写着的地址是/api/values,所以访问地址为:http://localhost:端口号/api/values.
那新建的控制器地址应该怎么写呢?
我们注意到在api/后面的这个”values“与控制器类名Controller前面的命名一致,所以这里新建的控制器类名为BooksController时,访问的地址就为:http://localhost:端口号/api/Books.
输入地址请求:
在这里插入图片描述
系统返回了上述方法中所返回的结果。
以上是网页直接请求得出的结果。

为了验证实用请求过程中数据的形式,我们是用http请求测试一下这个地址,我这里使用了一个基础版免费的接口测试工具叫PostMan,下载地址为:https://www.getpostman.com
输入地址进行Get请求,发现返回回来是一个值.
在这里插入图片描述
那如果get方法中返回的为一个对象,具体请求时会得到什么呢?
新建一个类为MathBooks

public class MathBooks
    {
        /// <summary>
        /// 书本编号
        /// </summary>
        public string Id { get; set; }
        /// <summary>
        /// 书本名称
        /// </summary>
        public string Name { get; set; }
     
    }

将原来的Get请求改为

 public MathBooks Get()
        {
            return new MathBooks(){ Id = "1", Name = "一元函数微分学" };
            //return "CLR Via C#";
        }

运行请求
在这里插入图片描述
可以看到返回了一个数组.
如果是一个List对象呢,测试一下该返回什么。

public List<MathBooks> Get()
        {
            return new List<MathBooks>()
            {
            new Models.MathBooks() { Id = "1", Name = "极限与连续"},
            new Models.MathBooks() { Id = "1", Name = "导数与微分"},
            new Models.MathBooks() { Id = "2", Name = "微分中值定理与导数的应用"},
            new Models.MathBooks() { Id = "3", Name = "不定积分"},
            new Models.MathBooks() { Id = "4", Name = "定积分与反常积分"},
            new Models.MathBooks() { Id = "5", Name = "二重积分"}
            };
            //return "CLR Via C#";
        }

返回了一个Json数组对象,由此可见,WebApi会自动序列化所自定义的任何返回类型,string,对象等等
在这里插入图片描述

三、WebAPI路由控制

上面提到,地址栏中的/api/values中的api如何更改成自定义的。带着这个问题,我们去寻找项目中一个叫App_Start的文件
在这里插入图片描述
这里有两个叫RouteConfigWebApiConfig的类。
RouteConfig是MVC的路由器。

   public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home",
                 action = "Index", id = UrlParameter.Optional }
            );
        }

WebApiConfig是WebApi的路由器。

  public static void Register(HttpConfiguration config)
        {
            // Web API 配置和服务

            // Web API 路由
            config.MapHttpAttributeRoutes();
            /*这是一个配置集,配置多个路由,默认由name、RouteTemplate、Defaults组成,这里映射了一个
            HttpRoute,name代表路由名称,它现在的名称是DefaultApi,在一个项目的路由集中它的名字不能重复, 
            routeTemplate代表路由模板,它是一个地址的定义规则,为什么前面地址栏上要加一个API,
            是因为在这里定义了,
            如果把//这个api改成自定义的,生成时访问的地址也将被重新定义,其中{controller}为控制器名称,
            {id}为参数,defaults中设置的id为RouteParamter.Optional,意思为可选参数,可填可不填*/
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }

上述路由模板中有个{id},这个是之前访问地址中调用get带参数形式时后置位加的id参数,/api/values/12345 id就是values后面的值.
此时我们在WebApi控制器中再添加一个Get方法

 public class BooksController : ApiController//WebAPI的控制器
    {
        public List<MathBooks> Get()
        {
            return new List<MathBooks>()
            {
            new Models.MathBooks() { Id = "1", Name = "极限与连续"},
            new Models.MathBooks() { Id = "1", Name = "导数与微分"},
            new Models.MathBooks() { Id = "2", Name = "微分中值定理与导数的应用"},
            new Models.MathBooks() { Id = "3", Name = "不定积分"},
            new Models.MathBooks() { Id = "4", Name = "定积分与反常积分"},
            new Models.MathBooks() { Id = "5", Name = "二重积分"}
            };
            //return "CLR Via C#";
        }

        public string Get(string BookName) //添加一个寻找书名的方法,需传入BookName参数,定义什么参数就传什么参数
        {
            return "寻找的书名为:"+BookName;
        }
    }

这个时候地址栏访问就应该输入http://localhost:xxxxx/api/books/?BookName=1 在books后面输入定义的Bookname参数,形式为?参数=XXX,在地址栏中,’?‘代表的是查询字符串
注意:在控制器中所定义的方法名前若不指定Attribute,则Get/Post/Put/Delete 前缀不能去除,否则无法引导,这是项目自定义的约束,会按方法名进行引导。若不指定Attribute的情况下方法名写成search_Book,则无法访问,需写成Getsearch_Book,或者方法名上加上[HttpGet]/[HttpPost]才能进行有效访问

	    [HttpGet] //这里指定Attribute,可去除Get/Post/Put/Delete前缀
        public string Search_Book(string book)
        {
            return "查找的书名为:" + book;
        }

接着创建一个Post方法,进行Post请求验证

    public string PostUpdate(MathBooks mb)
        {
            return "收到更新的书编号为:"+mb.Id+"书名为:"+mb.Name;
        }

在PostMan中输入地址,切换到Post模式,点击body,点击raw,切换到Json模式,输入Json字符串
在这里插入图片描述
成功返回结果在这里插入图片描述
如果传多个参数怎么办?

   public string PostUpdate(int id,string BookName,string bookStore,MathBooks mb)
        {
            return "收到更新的书编号为:"+mb.Id+"书名为:"+mb.Name;
        }

现在需要传入一个id,一个BookName,一个bookStore,再加一个对象,应该怎么请求?
首先定义的Id作为路由控制可选参数,直接在地址后/+参数即可,BookName和bookStore的参数需要使用上述讲到的查询字符串?+参数名=参数的形式,涉及到多个参数使用&&进行连接
http://localhost:xxxxx/api/Books/1?BookName=数学书&&bb=123
整个请求字符串就生成了,接着填入最后的MathBooks对象,进行Post请求
在这里插入图片描述
成果返回结果。
如果不想从地址栏中给参数,可在相应的参数前加一个[FromBody],代表参数只能从对象传入。

  //这里的FromBody特性指定操作参数只来自请求的实体对象
  public void Post([FromBody]string value)
  {
   
  }

三、WebAPI相应特性设置

前面提到,在使用Restful风格时,控制器中响应的方法名前缀必须带有Get/Post/Put/Delete,否则无法引导。那能不能不想遵从这种命名方式,通过自己设置引导呢,这里就要引用特性的设置。

    //路由前缀
    [RoutePrefix(prefix:"api/user")]
    public class BookManagerController : ApiController
    {
        [HttpPost] //没有用restful风格,需要指定用哪种类型来处理
        [Route(template:"Login")]//路由名称 routeName  路由特性 定制路由
        public string Login(UserViewModel Uvm)
        {
            return "ok";
        }

        [HttpGet]
        [Route(template:"Message")]
        public IHttpActionResult GetMessage()
        {
            //ok 200 只有ok可以带着结果回去
            //not found 404
            //InternalServerError 500
            //return InternalServerError(new Exception("error"));
            return Ok(new MathBooks() { Id="1",Name="牛津英语"});
        }

    }

类名前缀加上RoutePrefix特性,这是一个路由前缀,prefix指定了路由url。
’[HttpPost]’ 为指定了操作支持的类型,即在不同Restful风格的前提下需要通过指定操作类型来确定是进行Get还是Post等操作。
’ [Route(template:“Login”)]‘ 为路由名称,指定该地址访问的路径。
例如现在Login方法中配置的路由访问地址应为:api/user/login
回到路由前缀上,不写RoutePrefix也是可以的,只需要在路由名称中加入
[Route(template:“api/user/Login”)]也能够实现同样的效果。
好了到此,初步对WebAPI的认识有了一定的了解。
实例源码WebAPI_Demo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值