据说web api的作用和wcf的一样,只是比wcf更简单而已,具体如何我也不清楚,毕竟不是做学术研究的,我只是通过简单的例子来学习web api。能做的只需要知其然,不必管其所以然。当然有兴趣的可以去研究。

1、VS2013建立一个asp.net MVC4 web的应用程序

可以看到这个项目比一般的MVC项目多了几个文件夹,最主要的是控制器里面多了一个Values控制器,而且没有相应的视图。这也是与MVC的不同,主要是没有视图。这个Values控制器继承的是ApiController而不是Controller,这也是一个不同的地方

2、看看webapiconfig文件,这里设置了api的访问路由

3、WCF主要提供一个对数据增删改查的服务,那么作为它的瘦身版的web api也是如此。首先来看看这个Values控制器,系统自动提供了几个函数,首先看看两个GET函数,只是用于查询数据的。

// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
} // GET api/values/5
public string Get(int id)
{
return "value";
}

运行程序,在地址栏后面加上/api/values,可以看到程序返回的数据。至于为什么是xml格式的数据,这里就不讨论了,只需要知道我通过一个url就能访问Values控制器中get函数返回的数据。但是有两个get函数,为什么调用的是第一个。那是因为url能匹配的路由是DefaultApi,而且url中没有提供参数,所以就调用了第一个get函数。如果在地址栏后面加上/api/values/5的话,就能调用有参的get函数了。

控制器里面还有其他的函数,为什么这里要调用get函数而不是其他的。那是因为,在api中,所有用get方式请求的函数,都必须以get开头,否则就会报错:请求的资源不支持 http 方法“GET”。如果吧这两个get函数改一下名称,不以get开头,那么同样的url就没法访问数据了。但是不可能让所有的函数都以get开头吧,解决的方法就是对函数添加[HttpGet]约束,这样就可以用原来的url访问到数据了。那么问题又来了,如果有多个[HttpGet]修饰的无参函数,仍然以上面的url来访问,这时候又得报错了,因为系统发现可调用的函数不唯一,不知道该调用谁。这个时候我们就需要配置路由,定义更精确的url来访问函数了

4、webapiconfig文件,然后对values控制器的get函数修改下。

运行程序

5、web api是简单版的wcf,而wcf在完成后,是需要发布到服务器上,在使用的时候需要通过引入服务才能使用,而且还需要配置终结点。api也同样需要发布到服务器上,但是在用的时候只需要通过网址就能使用了,不需要去添加引用,配置复杂的终结点。下面就通过例子来看看如何在其他项目上调用web api

6、在解决方案中添加一个类库项目,用这个类库项目来模拟数据库。在项目中添加如下两个类,用来模拟数据源

public class SiteSource
{
public IList<Site> DateSource()
{
List<Site> sites = new List<Site>();
sites.Add(new Site { SiteId = , Title = "test", Uri = "www.cnblogs.cc" });
sites.Add(new Site { SiteId = , Title = "博客园首页", Uri = "www.cnblogs.com" });
sites.Add(new Site { SiteId = , Title = "博问", Uri = "q.cnblogs.com" });
sites.Add(new Site { SiteId = , Title = "新闻", Uri = "news.cnblogs.com" });
sites.Add(new Site { SiteId = , Title = "招聘", Uri = "job.cnblogs.com" });
return sites;
}
} public class Site
{
public int SiteId { get; set; }
public string Title { get; set; }
public string Uri { get; set; }
}

在values控制器中添加如下函数

 /// <summary>
/// 查询指定位置开始指定数量的数据
/// </summary>
/// <param name="index"></param>
/// <param name="num"></param>
/// <returns></returns>
[HttpGet]
public IEnumerable<Site> SearchSites(int index,int num)
{
SiteSource s = new SiteSource();
return s.DateSource().Skip(index).Take(num).ToList();
} /// <summary>
/// 根据title来查询
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
[HttpGet]
public Site SearchSites(string t)
{
SiteSource s = new SiteSource();
Site sit= s.DateSource().Where(o => o.Title == t).Single();
return sit;
}

7、在解决方案中再建一个MVC项目,通过这个项目来调用webapi实现数据的增删改查。建立好必要的控制器和视图,这里的控制器最好不要命名为home,因为它与webapi项目中的控制器同名了,这会导致待会在运行的时候报错。下面分别是控制器和视图中的代码

public class WebController : Controller
{
//
// GET: /WebApi/ public ActionResult Index()
{
IList<Site> s = getObjByTitle();
return View(s);
} private IList<Site> getObjByTitle()
{
HttpClient httpClient = new HttpClient();
//GET方式去调用webapi
var responseJson = httpClient.GetAsync("http://localhost:6972/api/values/SearchSites?t=test")
.Result.Content.ReadAsStringAsync().Result;

        Site site = JsonConvert.DeserializeObject<Site>(responseJson);
        IList<Site> sites = new List<Site>();
        sites.Add(site);

       return sites;
} }
@using Model;
@model IList<Site>
@{
ViewBag.Title = "Index";
} <h2>Index</h2>
@{
foreach (Site s in Model)
{
<h2>@s.Title</h2>
<h3>@s.Uri</h3>
}
}

8、准备运行程序,这个时候需要同时运行两个项目,除了类库以外的两个项目,在解决方案上右键,选择属性

运行,结果:

可以看到网页上出现了我想要的效果,调用是成功的。

与wcf比,webapi的优势是很明显的,首先一个,在调用的时候就不需要在项目中添加服务引用,直接一个网址搞定。其次,因为没有添加引用,项目和webapi就完全没有任何关联,也就是解耦了,那个网址,说白了就是个字符串,完全可以写到配置文件中去。然后,webapi的测试也很方便,只需要一个网址就可以测试,当然这里肯定涉及到了访问的安全机制,这不是本文讨论的范围。

还有几个疑问,webapi的访问方式有哪几种,如何实现数据的增删改,上面通过api获得的数据为什么是json格式,还能有其他格式吗。这些下回再讨论。

web api初学的更多相关文章

  1. C# web api 返回类型设置为json的两种方法

    每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...

  2. 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用

    由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...

  3. bootstrap + requireJS+ director+ knockout + web API = 一个时髦的单页程序

    也许单页程序(Single Page Application)并不是什么时髦的玩意,像Gmail在很早之前就已经在使用这种模式.通常的说法是它通过避免页面刷新大大提高了网站的响应性,像操作桌面应用程序 ...

  4. Hello Web API系列教程——Web API与国际化

    软件国际化是在软件设计和文档开发过程中,使得功能和代码设计能处理多种语言和文化习俗,在创建不同语言版本时,不需要重新设计源程序代码的软件工程方法.这在很多成熟的软件开发平台中非常常见.对于.net开发 ...

  5. ASP.NET Web API 跨域访问(CORS)

    一.客户端用JSONP请求数据 如果你想用JSONP来获得跨域的数据,WebAPI本身是不支持javascript的callback的,它返回的JSON是这样的: {"YourSignatu ...

  6. Web Api 入门实战 (快速入门+工具使用+不依赖IIS)

    平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html 屁话我也就不多说了,什么简介的也省了,直接简单概括+demo ...

  7. Web APi之认证(Authentication)两种实现方式【二】(十三)

    前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ...

  8. angular2系列教程(八)In-memory web api、HTTP服务、依赖注入、Observable

    大家好,今天我们要讲是angular2的http功能模块,这个功能模块的代码不在angular2里面,需要我们另外引入: index.html <script src="lib/htt ...

  9. 我这么玩Web Api(二):数据验证,全局数据验证与单元测试

    目录 一.模型状态 - ModelState 二.数据注解 - Data Annotations 三.自定义数据注解 四.全局数据验证 五.单元测试   一.模型状态 - ModelState 我理解 ...

随机推荐

  1. dstat系统分析工具的使用

    1.安装 方法一:yum #yum install -y dstat 方法二:rpm 官网下载地址: http://dag.wieers.com/rpm/packages/dstat #wget ht ...

  2. Windows Server 2008R2服务器IIS安装步骤

    注意点: 添加ASP.NET ..NET 扩展性.CGI.ISAPI 扩展.ISAPI 筛选器,去掉 目录浏览(因为大多数网站用不到.) 如果需要用到asp则勾选asp,如果需要用shtm需要开启在服 ...

  3. java多线程synchronized volatile解析

    先简单说说原子性:具有原子性的操作被称为原子操作.原子操作在操作完毕之前不会线程调度器中断.即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行.在Java中,对除了l ...

  4. tyvj1271 零式求和

    描述 请考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N.现在请在数列中插入“+”表示加,或者“-”表示减,抑或是“ ”表示空白(例如1-2 3就等于1- ...

  5. 线程间的通信----wait/notify机制

    wait/notify机制 实现多个线程之间的通信可以使用wait.notify.notifyAll三个方法.这三个方法都是Object类的方法.wait():导致当前线程等待,直到另一个线程调用此对 ...

  6. Java的动态代理(DynamicProxy)

    代理的概述 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 代理模式UML图 ...

  7. xtrabackup 恢复单表步骤

    1.apply-log应用redo日志,并导出表的数据字典innobackupex --apply-log --export  备份集 2.建表 如果知道表结构,则重建删除的表 create tabl ...

  8. 第6章 TCP/IP路由协议故障处理

    第6章 TCP/IP路由协议故障处理 一.缺省网关 当包的目的地址不在路由器的路由表中,如路由器配置了缺省网关,则转发到缺省网关,否则就丢弃. Show ip route :查看Cisco路由器的缺省 ...

  9. PHP移动互联网开发笔记(3)——运算符

    原文地址:http://www.php100.com/html/php/rumen/2014/0326/6704.html 一.PHP的运算符 PHP中有丰富的运算符集,它们中大部分直接来自于C语言. ...

  10. webrtc 视频 demo

    webrtc 视频 demo webrtc网上封装的很多,demo很多都是一个页面里实现的,今天实现了个完整的 , A 发视频给 B A webrtc.html作为offer <!DOCTYPE ...