博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MVC WebAPI 的基本使用
阅读量:6840 次
发布时间:2019-06-26

本文共 4383 字,大约阅读时间需要 14 分钟。

1.什么是WebAPI

  Web API是网络应用程序接口。包含了广泛的功能,网络应用通过API接口,可以实现存储服务、消息服务、计算服务等能力,利用这些能力可以进行开发出强大功能的web应用。

  它可以对接各种客户端(浏览器,移动设备),构建http服务的框架。

2.定义WebAPI接口

  Web API的接口有四种请求方式分别是:GET(获取一条或者多条数据)、POST(添加数据)、PUT(更新数据)和DELTE(删除数据)。

  由Web API的路由规则可知,Web API的路由规则只绑定到Controller,所以是根据请求的方式和传递的参数来匹配合适的Action,否则将会报错。

public static void Register(HttpConfiguration config)        {            config.Routes.MapHttpRoute(                name: "DefaultApi",                routeTemplate: "api/{controller}/{id}",                defaults: new { id = RouteParameter.Optional }            );        }

  定义主要由以下两种方式:

  (1)增加Post、Get、Put或者Delete的前缀

    这里的前缀不区分大小写,系统根据不同的http请求方式找到拥有相应前缀的方法名,具体如下所示:

 

public IEnumerable
GetUsers() { return new string[] { "value1", "value2" }; }

  (2)指定特性[HttpPost]、[HttpGet]、[HttpPut]和[HttpDelete]

    这种方式是等效于第一种方式的,但是当同时用了这两种方式,但是特性和前缀的访问方式不同的话,以特性为准。

  注意点:

    相同的请求方式下,方法名的命名规则和路由的匹配是没有关系的,如下:

[HttpGet]        public IEnumerable
Users() { return new string[] { "2", "value2" }; } [HttpGet] public IEnumerable
Cates() { return new string[] { "1", "value2" }; }

  这样通过get方式访问/api/Home/Users和/api/Home/Cates虽然方法名不同,但是结果却都是相同的报错,如下:

发生错误。
找到了与该请求匹配的多个操作: 类型 MvcApplication1.Api.HomeController 的 System.Collections.Generic.IEnumerable`1[System.String] Users() 类型 MvcApplication1.Api.HomeController 的 System.Collections.Generic.IEnumerable`1[System.String] Cates()
System.InvalidOperationException
在 System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext) 在 System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext) 在 System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken) 在 System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal(HttpRequestMessage request, CancellationToken cancellationToken) 在 System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)

  如果将方法稍作修改在Cates增加一个参数id,如下:

[HttpGet]        public IEnumerable
Users() { return new string[] { "2", "value2" }; } [HttpGet] public IEnumerable
Cates(int id) { return new string[] { "1", "value2" }; }

  那么访问/api/Home/Users?id=1或者任意的action如那么访问/api/Home/xxxx?id=1都可以正确访问得到如下结果:

1
value2

  但是访问/api/Home/Users或者/api/Home/Cate的话就会报错:

请求无效。
对于“MvcApplication1.Api.HomeController”中方法“System.Collections.Generic.IEnumerable`1[System.String] Cates(Int32)”的不可以为 null 的类型“System.Int32”的参数“id”,参数字典包含一个 null 项。可选参数必须为引用类型、可以为 null 的类型或声明为可选参数。

  综上所述,Web API的通过请求方式和传递的参数来寻找到对应的方法,与方法名无关。

3.参数的传递

  (1)[FromUri] 和 [FromBody]

  Web API的参数获取和普通的Controller有些许不同,参数提交有表单提交和url后面参数传递两种方式,Web API就有对应的着两种参数的获取分别[FromBody]获取表单提交的数据,[FromUri] 获取url传参。如下:

 

[HttpPost]        public IEnumerable
Users([FromUri]User user,[FromUri] int day,[FromBody] string str) { return new string[] { "2", "value2" }; }

 

  默认是[FromUri],否则就会获取指定方式传递的参数,可以是类会自动组装,不允许重复参数的传递与接收。

  (2)传统获取

  用下面这段代码可以获取get请求的数据:

var current = HttpContext.Current.Request;

  但是这样会有一个问题,就是前面讲到的,因为方法没有参数所以当方法众多时会有多个参数匹配的方法错误。

4.返回值

  Web API返回的数据格式有很多种如IEnumerable<string>(包括json格式和xml格式)、string、void等,但是使用的过程中基本时返回json或者xml格式的数据,所以这里主要讲这两种。Web API可以返回IEnumerable<string>这样的强类型,

默认返回的时xml格式的数据,在浏览器中输入地址,返回的是xml格式的数据,那怎么返回json格式的呢?

public HttpResponseMessage GETH(int id)        {            string[] strArry = new string[] { "2", "value2" };            string json = JsonConvert.SerializeObject(strArry);            //返回纯文本text/plain  ,返回json application/json  ,返回xml text/xml            HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(json, Encoding.GetEncoding("UTF-8"), "application/json") };            return result;        }

  以上的代码就可以返回json的数据,并且还有其他的返回格式。或者通过更改ajax请求头的contentType: "application/json; charset=utf-8"来将xml数据转为json格式。

 

 

 

 

转载于:https://www.cnblogs.com/xwc1996/p/9356395.html

你可能感兴趣的文章
web前端研发工程师编程能力成长之路
查看>>
linux 程序、动态库、静态库内部添加版本号和编译时间
查看>>
MySQL原生密码认证
查看>>
Centos6安装Zabbix3.4
查看>>
mysql忘记密码怎么改
查看>>
Qt5: SpringAnimation
查看>>
ASP.NET Web API Model-ModelBinder
查看>>
云游戏体验的魅力
查看>>
我的友情链接
查看>>
OpenStack Pike Minimal安装:三、镜像管理
查看>>
Linux command: ps -ef |grep java
查看>>
加锁查询 FOR UPDATE 解决表格查询极慢的问题
查看>>
iOS 开发之时间选择器
查看>>
44.作用域,局部和全局变量
查看>>
find、sed、awk、grep命令总结
查看>>
winpcap
查看>>
shell脚本编写乘法口诀
查看>>
mysql 最大链接数 max_connections 设置
查看>>
【源资讯 第37期】一个时代的终结 —— 再见, Flash !
查看>>
阶段性总结(一)
查看>>