1.什么是WebAPI

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

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

2.定义WebAPI接口

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

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

  1. public static void Register(HttpConfiguration config)
  2. {
  3. config.Routes.MapHttpRoute(
  4. name: "DefaultApi",
  5. routeTemplate: "api/{controller}/{id}",
  6. defaults: new { id = RouteParameter.Optional }
  7. );
  8. }

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

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

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

  1. public IEnumerable<string> GetUsers()
  2. {
  3. return new string[] { "value1", "value2" };
  4. }

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

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

  注意点:

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

  1. [HttpGet]
  2. public IEnumerable<string> Users()
  3. {
  4. return new string[] { "2", "value2" };
  5. }
  6. [HttpGet]
  7. public IEnumerable<string> Cates()
  8. {
  9. return new string[] { "1", "value2" };
  10. }

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

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

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

  1. [HttpGet]
  2. public IEnumerable<string> Users()
  3. {
  4. return new string[] { "2", "value2" };
  5. }
  6. [HttpGet]
  7. public IEnumerable<string> Cates(int id)
  8. {
  9. return new string[] { "1", "value2" };
  10. }

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

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

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

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

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

3.参数的传递

  (1)[FromUri] 和 [FromBody]

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

  1. [HttpPost]
  2. public IEnumerable<string> Users([FromUri]User user,[FromUri] int day,[FromBody] string str)
  3. {
  4. return new string[] { "2", "value2" };
  5. }

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

  (2)传统获取

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

  1. var current = HttpContext.Current.Request;

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

4.返回值

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

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

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

  以上的代码就可以返回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. SqlServer存储过程中常用函数及操作

    1.case语句 用于选择语句 SELECT ProductNumber, Category = CASE ProductLine WHEN 'R' THEN 'Road' WHEN 'M' THEN ...

  2. 使用ActiveMQ 传输文件 以及使用Jetty搭建内嵌文件服务器

    使用Active发送文件 ActiveMq 本身提供对于传输文件的支持. 1. 直接传输文件: 使用connection.createOutputStream 的形式.这种方式适合小文件.不能传输大文 ...

  3. window下编译ffmpeg

    网上关于编译ffmpeg的帖子很多,我也尝试了很多次,但是很多都过不了,一部分原因是版本问题,还有就是有的路劲没说的太明白导致的,经过一天的摸索,最终编译好了,下面把编译方式写下来,希望对看到帖子的人 ...

  4. IOS 自定义Operation(下载功能)

    一个下载操作就交给一个HMDownloadOperation对象 HMDownloadOperation.h / .m @class HMDownloadOperation; @protocol HM ...

  5. ABI 管理

    https://developer.android.google.cn/ndk/guides/abis.html 不同 Android 手机使用不同的 CPU,因此支持不同的指令集.CPU 与指令集的 ...

  6. Poj(1789),最小生成树,Prim

    题目链接:http://poj.org/problem?id=1789 还是套路. #include <stdio.h> #include <string.h> #define ...

  7. [pytorch] 官网教程+注释

    pytorch官网教程+注释 Classifier import torch import torchvision import torchvision.transforms as transform ...

  8. lintcode 77.Longest Common Subsequence(最长公共子序列)、79. Longest Common Substring(最长公共子串)

    Longest Common Subsequence最长公共子序列: 每个dp位置表示的是第i.j个字母的最长公共子序列 class Solution { public: int findLength ...

  9. 原生Servlet 上传文件

    依赖jar <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons ...

  10. xshell 连接虚拟机过程

    (1)Ctrl+Shift+T 打开终端 terminal (2)ifconfig得到ip网络地址 (3)ssh安装已经打开ssh服务 (4)安装openssh-server sudo apt ins ...