http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html

1. Web API简单说明

近来很多大型的平台都公开了Web API。比如百度地图 Web API,做过地图相关的人都熟悉。公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过在浏览器中使用 JavaScript来创建更丰富的HTML体验。所以我相信Web API会越来越有它的用武之地。

说道Web API很多人都会想到Web服务,但是他们仍然有一定的区别:Web API服务是通过一般的 HTTP公开了,而不是通过更正式的服务合同 (如SOAP)

 2. ASP.NET Web API简介

ASP. NET Web API支持让你能够轻松地创建功能强大的 Web API,可以从范围广泛的客户端 (包括使用 JavaScript从浏览器中,到任何移动/客户端平台上的本机应用程序)访问。它提供以下支持:

(1)现代 HTTP 的编程模型:在你的 Web 应用程序中直接访问和处理 HTTP 请求并响应,使用清洁、 强类型的 HTTP 对象模型。除了在服务器上支持这个 HTTP 的编程模型之外,通过使用新的 HttpClient API来从任何.NET 应用程序中调用 Web ApI,我们也支持客户端中相同的编程模型。

(2)内容协商: Web API 有对内容协商的内置支持 — — 这使客户端和服务器一起工作以决定从一个 API 返回的正确的数据格式。我们为JSON、 XML 和Form URL 编码的格式提供默认支持,并可以通过添加你自己的格式化程序来扩展这种支持,或者甚至用你自己的来替换默认的内容协商策略。

(3)查询组成: Web API 通过 OData URL 公约使你能够轻松地支持查询。当你从你的 Web API 返回一种类型的 IQueryable <T> 时,框架将自动为它提供 OData 查询支持— — 使其易于分页和排序。

(4)模型绑定和验证:模型绑定器提供了一种简单的方法来从HTTP 请求中的不同部分提取数据,并将这些信息部分转换为Web API行为可使用的.NET对象。Web API 支持相同的模型绑定和ASP. NET MVC 现今支持的验证基础结构。

(5)路由: Web ApI 支持完整的路由功能集。现今ASP. NET MVC 和 ASP.NET也支持这一点,包括路线参数和约束。默认情况下,Web API 还提供了智能公约,使你能够轻松地创建实现 Web ApI的类,而无需不得不将属性应用到你的类或方法中。Web API 的配置纯粹是通过代码来实现的 — — 保持你的配置文件干净。

(6)筛选器: Web ApI 使你能够轻松地使用和创建筛选器 (例如: [授权]),那样你能够封装和应用交叉行为。

(7)改进的可测试性: 与其在静态文本对象中设置 HTTP 的详细信息,不如将 Web API 行为与 HttpRequestMessage 和 HttpResponseMessage 一起使用— — 两个新 的HTTP对象 (在其他内) 使测试更容易。例如,你可以单元测试你的 Web ApI,而无需不得不使用 Mocking 框架。

(8)IoC支持: Web API 支持由 ASP. NET MVC 实现的服务定位器模式,使你能够解决不同设备的依赖。你可以轻松地使用IoC容器或依赖注射架构来集成,以保持干净的依赖解决方案。

(9)灵活的托管: Web ApI可以托管在任何类型的 ASP.NET应用程序内 (包括这两个基于应用程序的ASP. NET MVC和ASP.NET Web Forms)。我们还设计了 Web API 支持,这样,你还可以选择在你自己的进程内托管/公开它们,如果你不想使用 ASP.NET/IIS 来这样做。至于你如何以及在哪儿使用它,这给了你最大的灵活性。

 3. 创建一个Web API程序

启动VS2012创建一个新项目,在已经安装的模板中选择 ASP.NET MVC4 Web API程序

在ASP.NET MVC项目对话框中选择Web API项,点击确定

创建成功之后工程中会自动添加一个Web API服务控制器,上面并附带访问地址

项目解决方案,选择Models文件夹右键 添加一个Model类

代码如下:

  1.  
  2. namespace Git.Framework.WebAPI.Models
  3.  
  4. {
  5.  
  6.     public class Contact
  7.  
  8.     {
  9.  
  10.         public int ID { get; set; }
  11.  
  12.         public string Name { get; set; }
  13.  
  14.         public string Sex { get; set; }
  15.  
  16.         public DateTime Birthday { get; set; }
  17.  
  18.         public int Age { get; set; }
  19.  
  20.     } }
  21.  

工程解决方案选择Controllers文件夹右键添加一个新的Web API controller

在添加控制器弹出对话框中选择模板: 空API控制器

控制器中添加如下代码:

  1.  
  2.  
  3. namespace Git.Framework.WebAPI.Controllers
  4.  
  5. {
  6.  
  7.     public class ContactController : ApiController
  8.  
  9.     {
  10.  
  11.         Contact[] contacts = new Contact[] 
  12.  
  13.         { 
  14.  
  15.             new Contact(){ ID=1, Age=23, Birthday=Convert.ToDateTime("1977-05-30"), Name="情缘", Sex="男"},
  16.  
  17.             new Contact(){ ID=2, Age=55, Birthday=Convert.ToDateTime("1937-05-30"), Name="令狐冲", Sex="男"},
  18.  
  19.             new Contact(){ ID=3, Age=12, Birthday=Convert.ToDateTime("1987-05-30"), Name="郭靖", Sex="男"},
  20.  
  21.             new Contact(){ ID=4, Age=18, Birthday=Convert.ToDateTime("1997-05-30"), Name="黄蓉", Sex="女"},
  22.  
  23.         };
  24.  
  25.         /// <summary>
  26.  
  27.         /// /api/Contact
  28.  
  29.         /// </summary>
  30.  
  31.         /// <returns></returns>
  32.  
  33.         public IEnumerable<Contact> GetListAll()
  34.  
  35.         {
  36.  
  37.             return contacts;
  38.  
  39.         }
  40.  
  41.         /// <summary>
  42.  
  43.         /// /api/Contact/id
  44.  
  45.         /// </summary>
  46.  
  47.         /// <param name="id"></param>
  48.  
  49.         /// <returns></returns>
  50.  
  51.         public Contact GetContactByID(int id)
  52.  
  53.         {
  54.  
  55.             Contact contact = contacts.FirstOrDefault<Contact>(item=>item.ID==id);
  56.  
  57.             if (contact == null)
  58.  
  59.             {
  60.  
  61.                 throw new HttpResponseException(HttpStatusCode.NotFound);
  62.  
  63.             }
  64.  
  65.             return contact;
  66.  
  67.         }
  68.  
  69.         /// <summary>
  70.  
  71.         /// 根据性别查询
  72.  
  73.         /// /api/Contact?sex=女
  74.  
  75.         /// </summary>
  76.  
  77.         /// <param name="sex"></param>
  78.  
  79.         /// <returns></returns>
  80.  
  81.         public IEnumerable<Contact> GetListBySex(string sex)
  82.  
  83.         {
  84.  
  85.             return contacts.Where(item => item.Sex == sex);
  86.  
  87.         }
  88.  
  89.     }}
  90.  

4. 浏览器访问API路径

Controller
Methed

URI

GetListAll

/api/Contact

GetListBySex

"/api/Contact?sex=" + sex

GetContactByID

/api/Contact/"+id

在IE浏览器中浏览出现如下效果

如果在Chrome 或者 FireFox 中浏览会先下如下效果

5. Javascript访问Web API

在项目中添加一个About View视图

代码如下:

  1.  
  2.  
  3. @{
  4.  
  5.     Layout = null;
  6.  
  7. }
  8.  
  9. <!DOCTYPE html>
  10.  
  11. <html>
  12.  
  13. <head>
  14.  
  15.     <meta name="viewport" content="width=device-width" />
  16.  
  17.     <title>About</title>
  18.  
  19.     <script type="text/javascript" src="/Scripts/jquery-1.7.1.min.js"></script>
  20.  
  21.     <script type="text/ecmascript">
  22.  
  23.         $(document).ready(function () {
  24.  
  25.             $("#btnAll").click(function () {
  26.  
  27.                 $.getJSON("/api/Contact", function (data) {
  28.  
  29.                     var html = "<ul>";
  30.  
  31.                     $(data).each(function (i, item) {
  32.  
  33.                         html += "<li>"+item.ID+":"+item.Name+":"+item.Sex+"</li>";
  34.  
  35.                     });
  36.  
  37.                     html += "</ul>";
  38.  
  39.                     $("#contactAll").html(html);
  40.  
  41.                 });
  42.  
  43.             });
  44.  
  45.             $("#btnID").click(function () {
  46.  
  47.                 var id = $("#txtID").val();
  48.  
  49.                 $.getJSON("/api/Contact/"+id, function (data) {
  50.  
  51.                     var html = "<ul>";
  52.  
  53.                     $(data).each(function (i, item) {
  54.  
  55.                         html += "<li>" + item.ID + ":" + item.Name + ":" + item.Sex + "</li>";
  56.  
  57.                     });
  58.  
  59.                     html += "</ul>";
  60.  
  61.                     $("#contactID").html(html);
  62.  
  63.                 });
  64.  
  65.             });
  66.  
  67.             $("#btnSex").click(function () {
  68.  
  69.                 var sex = $("#ddlSex").val();
  70.  
  71.                 $.getJSON("/api/Contact?sex=" + sex, function (data) {
  72.  
  73.                     var html = "<ul>";
  74.  
  75.                     $(data).each(function (i, item) {
  76.  
  77.                         html += "<li>" + item.ID + ":" + item.Name + ":" + item.Sex + "</li>";
  78.  
  79.                     });
  80.  
  81.                     html += "</ul>";
  82.  
  83.                     $("#contactSex").html(html);
  84.  
  85.                 });
  86.  
  87.             });
  88.  
  89.         });
  90.  
  91.     </script>
  92.  
  93. </head>
  94.  
  95. <body>
  96.  
  97.     <p>
  98.  
  99.         <input type="button" id="btnAll" value="查询所有" />&nbsp;
  100.  
  101.     </p>
  102.  
  103.     <p>
  104.  
  105.         <input type="text"  id="txtID" name="txtID"/>
  106.  
  107.         <input type="button" id="btnID" value="根据ID查询" />&nbsp;
  108.  
  109.     </p>
  110.  
  111.     <p>
  112.  
  113.         <select id="ddlSex" name="ddlSex">
  114.  
  115.             <option value="男">男</option>
  116.  
  117.             <option value="女">女</option>
  118.  
  119.         </select>
  120.  
  121.         <input type="button" id="btnSex" value="根据性别查询" />&nbsp;
  122.  
  123.     </p>
  124.  
  125.     <div id="contactAll">
  126.  
  127.     </div>
  128.  
  129.     <div id="contactID">
  130.  
  131.     </div>
  132.  
  133.     <div id="contactSex">
  134.  
  135.     </div>
  136.  
  137. </body>
  138.  

</html>

运行结果效果图

 6. Web API总结

1.Web API 控制器(Controller) 继承ApiController

2. Api 的 Url Map: api/{controller}/{id} 每个"Action"是通过 Http谓词(GET/POST/PUT/DELETE)映射的

3.客户端可以通过 Http Header 的 Accept 指定返回数据的格式。默认是支持:appliction/xml 和 application/json,当想返回比如 image/jpeg 这样的图片格式时,需要添加 MediaTypeFormatter 。比如:当指定某个 Task 时,通过指定 Accept : image/jpeg 获取该 Task 的图片信息。(后面详细介绍)

该系列大概20篇左右,期待各位的拍砖!

ASP.NET MVC Web API 学习笔记---第一个Web API程序【转】的更多相关文章

  1. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  2. 【转载】ASP.NET MVC Web API 学习笔记---第一个Web API程序

    1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过 ...

  3. ASP.NET MVC Web API 学习笔记---第一个Web API程序---近来很多大型的平台都公开了Web API

    1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过 ...

  4. ASP.NET MVC 5 系列 学习笔记 目录 (持续更新...)

    前言: 记得当初培训的时候,学习的还是ASP.NET,现在回想一下,图片水印.统计人数.过滤器....HttpHandler是多么的经典! 不过后来接触到了MVC,便立马爱上了它.Model-View ...

  5. ASP.Net MVC开发基础学习笔记:一、走向MVC模式

    一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/bl ...

  6. ASP.Net MVC开发基础学习笔记:五、区域、模板页与WebAPI初步

    一.区域—麻雀虽小,五脏俱全的迷你MVC项目 1.1 Area的兴起 为了方便大规模网站中的管理大量文件,在ASP.NET MVC 2.0版本中引入了一个新概念—区域(Area). 在项目上右击创建新 ...

  7. ASP.Net MVC开发基础学习笔记(5):区域、模板页与WebAPI初步

    一.区域—麻雀虽小,五脏俱全的迷你MVC项目 1.1 Area的兴起 为了方便大规模网站中的管理大量文件,在ASP.NET MVC 2.0版本中引入了一个新概念—区域(Area). 在项目上右击创建新 ...

  8. ASP.Net MVC开发基础学习笔记(1):走向MVC模式

    一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/bl ...

  9. 【jqGrid for ASP.NET MVC Documentation】.学习笔记.1.介绍

    1 介绍 jqGrid for ASP.NET MVC 是一个服务端组件. 专为MVC    分隔 model ,view , controller 的原则,完全观察者模式 非常快的速度    仅仅很 ...

随机推荐

  1. 前端应该掌握的CSS实现多列等高布局

    1.引言 我们在写页面的时候,有的时候会遇到多栏布局,每个栏目里面的内容有的时候可能不一样,这样就会导致每个栏目实际的高度也是不一样的,如果每个栏目有背景颜色的,就会导致每个栏目的底部是对不齐的,用户 ...

  2. c++ primer 读书笔记

    顺序容器:为程序提供控制元素存储和访问顺序的能力,这种顺序与元素加入到容器时的位置相对应,而与元素值无关. 另外还有根据关键字的值来存储元素的容器:有序.无序关联容器. 另外STL还有三种容器适配器, ...

  3. nyoj 325

    zb的生日 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么 ...

  4. [BZOJ1066][luogu_P2472][SCOI2007]蜥蜴

    [BZOJ1066][luogu_P2472][SCOI2007]蜥蜴 试题描述 在一个 \(r\) 行 \(c\) 列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥 ...

  5. 【BZOJ 5047 空间传送装置】

    Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 282  Solved: 121[Submit][Status][Discuss] Descriptio ...

  6. jQuery初级

    一.简介 定义 jQuery创始人是美国John Resig,是优秀的Javascript框架: jQuery是一个轻量级.快速简洁的javaScript库.源码戳这 jQuery对象 jQuery产 ...

  7. javasript深度拷贝

    1 将json数据转换为字符串形式 var j={"name":"daenerys targaryen","dragon":"{& ...

  8. JavaScript 笔记(3) -- JSON

    JavaScript JSON (JavaScript Object Notation): 是一种轻量级的数据交换格式 JSON 是用于存储和传输数据的格式 JSON 通常用于服务端向网页传递数据 J ...

  9. 关于 react state的改变数据上面的一点问题

    在react当中 比如说 this.state = { loginInfo: { account: "...", password: "..." } } thi ...

  10. Nature Reserve

    Nature Reserve time limit per test:2 seconds memory limit per test:256 megabytes input:standard inpu ...