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<string> GetUsers()
{
return new string[] { "value1", "value2" };
}

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

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

  注意点:

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

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

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

<Error>
<Message>发生错误。</Message>
<ExceptionMessage>
找到了与该请求匹配的多个操作: 类型 MvcApplication1.Api.HomeController 的 System.Collections.Generic.IEnumerable`1[System.String] Users() 类型 MvcApplication1.Api.HomeController 的 System.Collections.Generic.IEnumerable`1[System.String] Cates()
</ExceptionMessage>
<ExceptionType>System.InvalidOperationException</ExceptionType>
<StackTrace>
在 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)
</StackTrace>
</Error>

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

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

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

<ArrayOfstring xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<string>1</string>
<string>value2</string>
</ArrayOfstring>

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

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

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

3.参数的传递

  (1)[FromUri] 和 [FromBody]

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

        [HttpPost]
public IEnumerable<string> 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格式。

MVC WebAPI 的基本使用的更多相关文章

  1. ASP.NET Core MVC/WebAPi 模型绑定探索

    前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...

  2. mvc+webapi 单元测试

    1.前言 现在这个项目已经有阶段性的模块完成了,所以就想着对这些模块进行单元测试,以保证项目的代码的质量.首先虽然标题是mvc+webapi实质上我只是对mvc进行的测试.用的时候vs的unit te ...

  3. 让Asp.net mvc WebAPI 支持OData协议进行分页查询操作

    这是我在用Asp.net mvc WebAPI 支持 OData协议 做分页查询服务时的 个人拙笔. 代码已经开发到oschina上.有兴趣的朋友可以看看,欢迎大家指出不足之处. 看过了园子里的几篇关 ...

  4. MVC WebAPI 三层分布式框架开发

    版权声明:本文为博主原创文章,未经博主允许不得转载. 前言:SOA(面向服务的架构)是目前企业应用开发过程中普遍采用的技术,基于MVC WebAPI三层分布式框架开发,以此适用于企业信息系统的业务处理 ...

  5. 启用 mvc webapi 的 session功能可用

    默认 mvc webapi 不开启 session 会话支持 所以需要修改配置,在 Global 开启 session 支持 如下: 1.重写 init() 方法 public override vo ...

  6. .net和java和谐相处之安卓客户端+.net asp.net mvc webapi 2

    作为没有花很多时间转java,把java当C#用的我,在做服务器端程序的时候,自然不想考虑java web,java需要学的框架太多了,看了一下Java Servlet,始终没有编码的冲动.经过几天的 ...

  7. 转载CSDN (MVC WebAPI 三层分布式框架开发)

    前言:SOA(面向服务的架构)是目前企业应用开发过程中普遍采用的技术,基于MVC WebAPI三层分布式框架开发,以此适用于企业信息系统的业务处理,是本文论述的重点.此外,插件技术的应用,富客户端JQ ...

  8. Visual Studio 2015 Owin+MVC+WebAPI+ODataV4+EntityFrawork+Identity+Oauth2.0+AngularJS 1.x 学习笔记

    2016年,.net 会有很多大更新 ASP.NET 5 在此之前我都是用着古老的.net做开发的 (WebForm + IIS) 为了接下来应对 .net 的新功能,我特地去学习了一下基本的 MVC ...

  9. MVC WebApi 用户验证 (2)

    构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(66)-MVC WebApi 用户验证 (2)   前言: 构建ASP.NET MVC5+EF6+E ...

  10. 项目架构mvc+webapi

    mvc+webapi 项目架构 首先项目是mvc5+webapi2.0+orm-dapper+ef codefirst. 1.项目框架层次结构: 这个mvc项目根据不同的业务和功能进行不同的区域划分, ...

随机推荐

  1. php的yii框架开发总结10

    1.CActiveForm是Chtml类的封装,但是它有数据验证的功能,有三种方式:服务器端.客户端.Ajax数据验证. 服务器端验证:当整个表单页面被提交后,在服务器端 进行验证.如果存在任何验证错 ...

  2. 初看Mybatis 源码 (一)

    Mybatis 的使用,首先需要构建一个SqlSessionFactory 实例.而该实例可以通过SqlSessionFactoryBuilder来创建. String resource = &quo ...

  3. U深度U盘启动盘制作工具怎么用?U深度U盘启动盘制作工具使用教学

    U深度u盘启动盘制作工具是一款强大的启动盘制作软件,对于新手用户来说,由于软件专业度很高,想一下就上手是比较困难的.所以这里给大家分享一篇U深度u盘启动盘制作工具的使用教程. 使用教程: 第一步:安装 ...

  4. Multi-modal Sentence Summarization with Modality Attention and Image Filtering 论文笔记

     文章已同步更新在https://ldzhangyx.github.io/,欢迎访问评论.   五个月没写博客了,不熟悉我的人大概以为我挂了…… 总之呢这段时间还是成长了很多,在加拿大实习的两个多月来 ...

  5. pt-table-sync

    高效的同步MySQL表之间的数据,他可以做单向和双向同步的表数据.他可以同步单个表,也可以同步整个库.它不同步表结构.索引.或任何其他模式对象.所以在修复一致性之前需要保证他们表存在.   使用范例: ...

  6. LA 2965 中途相遇法

    题目链接:https://vjudge.net/problem/UVALive-2965 题意: 有很多字符串(24),选出一些字符串,要求这些字符串的字母都是偶数次: 分析: 暴力2^24也很大了, ...

  7. Linux内存管理 —— 内核态和用户态的内存分配方式

    1. 使用buddy系统管理ZONE我的这两篇文章buddy系统和slab分配器已经分析过buddy和slab的原理和源码,因此一些细节不再赘述.所有zone都是通过buddy系统管理的,buddy ...

  8. Linux驱动学习(编写一个最简单的模块)

    在Linux中想做驱动开发,那么一定要先熟悉module的使用和编写 一.什么是module 从名字上看就是模块的意思,我个人的理解就是一个一个的小程序,可以进行动态的安装和卸载,而在这里面就实现一些 ...

  9. 阅读list

    最近感觉效率不高,其实有很多事情要做的,读书的速度也慢下来了,要抓紧时间的了. 继续读deep learning 一书的part II. 读完jifeng dai的几篇文章,去年欠下的债务啊.其中包括 ...

  10. 批量删除xml文件中的<?xml version="1.0" ?>

    #!/bin/shcd 'home/usrname/'ls cd '/home/usrname/VOC2007/Annotations/' for file in `ls /home/usrname/ ...