MVC WebAPI 的基本使用
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 的基本使用的更多相关文章
- ASP.NET Core MVC/WebAPi 模型绑定探索
前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...
- mvc+webapi 单元测试
1.前言 现在这个项目已经有阶段性的模块完成了,所以就想着对这些模块进行单元测试,以保证项目的代码的质量.首先虽然标题是mvc+webapi实质上我只是对mvc进行的测试.用的时候vs的unit te ...
- 让Asp.net mvc WebAPI 支持OData协议进行分页查询操作
这是我在用Asp.net mvc WebAPI 支持 OData协议 做分页查询服务时的 个人拙笔. 代码已经开发到oschina上.有兴趣的朋友可以看看,欢迎大家指出不足之处. 看过了园子里的几篇关 ...
- MVC WebAPI 三层分布式框架开发
版权声明:本文为博主原创文章,未经博主允许不得转载. 前言:SOA(面向服务的架构)是目前企业应用开发过程中普遍采用的技术,基于MVC WebAPI三层分布式框架开发,以此适用于企业信息系统的业务处理 ...
- 启用 mvc webapi 的 session功能可用
默认 mvc webapi 不开启 session 会话支持 所以需要修改配置,在 Global 开启 session 支持 如下: 1.重写 init() 方法 public override vo ...
- .net和java和谐相处之安卓客户端+.net asp.net mvc webapi 2
作为没有花很多时间转java,把java当C#用的我,在做服务器端程序的时候,自然不想考虑java web,java需要学的框架太多了,看了一下Java Servlet,始终没有编码的冲动.经过几天的 ...
- 转载CSDN (MVC WebAPI 三层分布式框架开发)
前言:SOA(面向服务的架构)是目前企业应用开发过程中普遍采用的技术,基于MVC WebAPI三层分布式框架开发,以此适用于企业信息系统的业务处理,是本文论述的重点.此外,插件技术的应用,富客户端JQ ...
- Visual Studio 2015 Owin+MVC+WebAPI+ODataV4+EntityFrawork+Identity+Oauth2.0+AngularJS 1.x 学习笔记
2016年,.net 会有很多大更新 ASP.NET 5 在此之前我都是用着古老的.net做开发的 (WebForm + IIS) 为了接下来应对 .net 的新功能,我特地去学习了一下基本的 MVC ...
- MVC WebApi 用户验证 (2)
构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(66)-MVC WebApi 用户验证 (2) 前言: 构建ASP.NET MVC5+EF6+E ...
- 项目架构mvc+webapi
mvc+webapi 项目架构 首先项目是mvc5+webapi2.0+orm-dapper+ef codefirst. 1.项目框架层次结构: 这个mvc项目根据不同的业务和功能进行不同的区域划分, ...
随机推荐
- SqlServer存储过程中常用函数及操作
1.case语句 用于选择语句 SELECT ProductNumber, Category = CASE ProductLine WHEN 'R' THEN 'Road' WHEN 'M' THEN ...
- 使用ActiveMQ 传输文件 以及使用Jetty搭建内嵌文件服务器
使用Active发送文件 ActiveMq 本身提供对于传输文件的支持. 1. 直接传输文件: 使用connection.createOutputStream 的形式.这种方式适合小文件.不能传输大文 ...
- window下编译ffmpeg
网上关于编译ffmpeg的帖子很多,我也尝试了很多次,但是很多都过不了,一部分原因是版本问题,还有就是有的路劲没说的太明白导致的,经过一天的摸索,最终编译好了,下面把编译方式写下来,希望对看到帖子的人 ...
- IOS 自定义Operation(下载功能)
一个下载操作就交给一个HMDownloadOperation对象 HMDownloadOperation.h / .m @class HMDownloadOperation; @protocol HM ...
- ABI 管理
https://developer.android.google.cn/ndk/guides/abis.html 不同 Android 手机使用不同的 CPU,因此支持不同的指令集.CPU 与指令集的 ...
- Poj(1789),最小生成树,Prim
题目链接:http://poj.org/problem?id=1789 还是套路. #include <stdio.h> #include <string.h> #define ...
- [pytorch] 官网教程+注释
pytorch官网教程+注释 Classifier import torch import torchvision import torchvision.transforms as transform ...
- lintcode 77.Longest Common Subsequence(最长公共子序列)、79. Longest Common Substring(最长公共子串)
Longest Common Subsequence最长公共子序列: 每个dp位置表示的是第i.j个字母的最长公共子序列 class Solution { public: int findLength ...
- 原生Servlet 上传文件
依赖jar <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons ...
- xshell 连接虚拟机过程
(1)Ctrl+Shift+T 打开终端 terminal (2)ifconfig得到ip网络地址 (3)ssh安装已经打开ssh服务 (4)安装openssh-server sudo apt ins ...