关于操作 ASP.NET Web API的实例
WCF的野心造成了它的庞大复杂,HTTP的单纯造就了它的简单优美。为了实现分布式Web应用,我们不得不将两者凑合在一起 —— WCF服务以HTTP绑定宿主于IIS。
于是有了让人晕头转向的配置、让人郁闷不已的调试,还有那ServiceContract, DataContract, EnumMember...还有还有,不要在using语句中调用WCF服务...
于是经常自问:拿着牛刀削苹果有必要吗?废话,当然没有必要,水果刀在哪里?
微软看着这么多人拿着牛刀削苹果,自己也看不下去了,于是,一种水果刀横空出世 —— ASP.NET Web API。
最近我们在实际开发中有个地方用WCF太麻烦,就小试了一下水果刀,感觉还不错。
下面用一个简单的示例分享一下ASP.NET Web API水果刀的用法。
服务端ASP.NET Web API的实现
需要准备的工具:Visual Studio 2010, NuGet
1. 新建一个空的ASP.NET Web Application项目。
2. 通过NuGet添加ASP.NET Web API的引用,在NuGet中搜索时要用“AspNetWebApi”(用“ASP.NET Web API”是搜索不到的),然后选择ASP.NET Web API(Beta)进行安装。
3. 添加Global.asax,在Application_Start中注册Web API的路由,在Global.asax.cs中添加如下代码:
1
2
3
4
|
protected void Application_Start(object sender, EventArgs e) { RouteTable.Routes.MapHttpRoute( "WebApi" , "api/{controller}/{action}/{id}" , new { id = RouteParameter.Optional }); } |
4. 添加Controllers文件夹,在其中添加类文件DemoController.cs,并让DemoController继承自ApiController。代码如下:
1
2
3
4
5
|
namespace CNBlogsWebApiDemo.Controllers { public class DemoController : ApiController { } } |
5. 添加ViewModels文件夹,在其中添加Site.cs,并定义Site。
1
2
3
4
5
|
namespace CNBlogsWebApiDemo.ViewModels { public class Site { public int SiteId { get; set; } public string Title { get; set; } public string Uri { get; set; } } } |
6. 给DemoController添加一个方法SiteList,并写上我们的示例代码。代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
public class DemoController : ApiController { public IList<Site> SiteList(int startId, int itemcount) { var sites = new List<Site>(); sites.Add( new Site { SiteId = 1, Title = "test" , Uri = "www.cnblogs.cc" }); sites.Add( new Site { SiteId = 2, Title = "博客园首页" , Uri = "www.cnblogs.com" }); sites.Add( new Site { SiteId = 3, Title = "博问" , Uri = "q.cnblogs.com" }); sites.Add( new Site { SiteId = 4, Title = "新闻" , Uri = "news.cnblogs.com" }); sites.Add( new Site { SiteId = 5, Title = "招聘" , Uri = "job.cnblogs.com" }); var result = (from Site site in siteswhere site.SiteId > startIdselect site) .Take(itemcount) .ToList(); return result; } } |
7. 配置一下Web项目的启动设置Specific Page与Specific port
8. Ctrl+F5运行项目,结果如下:
结果是我们期望的,用浏览器直接可以查看Web API的运行结果,测试时会很方便。
好了,服务端Web API就这么轻松搞定了!
客户端通过HttpClient调用服务端Web API
1. 新建一个WebApiTest的类库项目。
2. 在NuGet中添加System.Net.Http(HttpClient就在这里), Json.NET, xUnit.net。
3. 添加类文件WebApiClientTest.cs,添加测试方法WebApi_SiteList_Test:
1
2
3
4
5
6
7
8
9
|
namespace WebApiClientTest { public class WebApiClientTest { [Fact] public void WebApi_SiteList_Test() { } } } |
4. WebApi_SiteList_Test() 的代码实现
4.1 首先,要确定三个东西:
a) 客户端调用WebAPI的方式是Http Get,还Http Post,我们这里选用Http Post;
b) 客户端调用WebAPI时传递的参数格式,我们这里选用的是Json。
c) WebAPI返回的数据格式,我们这里选用的也是Json(这也是之前添加Json.NET引用的原因)。
4.2 用到的类
System.Net.Http.HttpClient
System.Net.Http.httpContent
System.Net.Http.StringContent
System.Net.Http.Headers.MediaTypeHeaderValue
Newtonsoft.Json.JsonConvert
4.3 准备需要传递给WebAPI的参数
需要传递的两个参数是startId ,itemcount,传递的格式是Json。这里可没有Javascript中的JSON.stringify(),但我们有Json.NET,再加上匿名类型,有点用js的感觉,代码如下:
1
|
var requestJson = JsonConvert.SerializeObject( new { startId = 1, itemcount = 3 }); |
代码的运行结果:{"startId":1,"itemcount":3}
然后用System.Net.Http.StringContent把它打个包:
1
|
HttpContent httpContent = new StringContent(requestJson); |
然后设置一下ContentType:
1
|
httpContent.Headers.ContentType = new MediaTypeHeaderValue( "application/json" ); |
4.4 通过Http Post调用WebAPI得到返回结果
HttpClient闪亮登场,调用它的PostAsync()方法轻松搞定:
1
2
|
var httpClient = new HttpClient(); var responseJson = httpClient.PostAsync( "http://localhost:9000/api/demo/sitelist" , httpContent) .Result.Content.ReadAsStringAsync().Result; |
看一下responseJson的结果:
1
|
[{ "SiteId" :2, "Title" : "博客园首页" , "Uri" : "www.cnblogs.com" },{ "SiteId" :3, "Title" : "博问" , "Uri" : "q.cnblogs.com" },{ "SiteId" :4, "Title" : "新闻" , "Uri" : "news.cnblogs.com" }] |
正宗的Json!你注意到没有,服务端WebAPI的代码未作任何修改,我们只是在Http Headers中将ContentType设置为了application/json,返回的就是Json格式的数据。而我们通过浏览器访问,得到的还是标准的XML。这里就是ASP.NET Web API的魅力之一 —— 一次实现,按需服务。
4.5 将Json格式返回的结果反序列化为强类型
Json.NET又登场:
1
|
var sites = JsonConvert.DeserializeObject<IList<Site>>(responseJson); |
展示一下返回结果:
代码
1
|
sites.ToList().ForEach(x => Console.WriteLine(x.Title + ":" + x.Uri)); |
结果
1
2
3
|
博客园首页:www.cnblogs.com 博问:q.cnblogs.com 新闻:news.cnblogs.com |
4.6 WebApi_SiteList_Test() 完整实现代码
1
2
3
4
5
6
7
8
9
10
11
12
|
public class WebApiClientTest { [Fact] public void WebApi_SiteList_Test() { var requestJson = JsonConvert.SerializeObject( new { startId = 1, itemcount = 3 }); HttpContent httpContent = new StringContent(requestJson); httpContent.Headers.ContentType = new MediaTypeHeaderValue( "application/json" ); var httpClient = new HttpClient(); var responseJson = httpClient.PostAsync( "http://localhost:9000/api/demo/sitelist" , httpContent) .Result.Content.ReadAsStringAsync().Result; var sites = JsonConvert.DeserializeObject<IList<Site>>(responseJson); sites.ToList().ForEach(x => Console.WriteLine(x.Title + ":" + x.Uri)); } } |
注:运行这里的代码之前,要先运行WebAPI项目,先把服务跑起来,客户端才能享受到服务。
与jQuery ajax调用代码比较一下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
var requestJson = JSON.stringify({ startId: 1, itemcount: 3 }); $.ajax({ url: '/api/demo/sitelist' , data: requestJson, type: "post" , dataType: "json" , contentType: "application/json; charset=utf8" , success: function (data) { jQuery.each(data, function (i, val) { $( "#result" ).append(val.Title + ': ' + val.Uri + '<br/>' ); }); } }); |
注:上面的代码是可真实运行的哦,代码在示例代码WebApiDemo项目的AjaxWebApi.htm文件中。这也是ASP.NET Web API “一次实现,按需服务”的体现。
小结
水果刀(ASP.NET Web API)用下来感觉还不错,不仅可以削苹果,还可以削梨子,切西瓜也不在话下。用不用牛刀(WCF),还得多考虑考虑。
以上就是关于操作 ASP.NET Web API的实例的详细内容,更多请关注php中文网其它相关文章!
关于操作 ASP.NET Web API的实例的更多相关文章
- 使用HttpClient操作ASP.NET Web API 2.1增删改查
使用NuGet包安装Microsoft ASP.NET Web API 2.1 Client Libraries, 调用方式代码如下: HttpClient client = new HttpClie ...
- 剖析Asp.Net Web API路由系统---WebHost部署方式
上一篇我们剖析了Asp.Net路由系统,今天我们再来简单剖析一下Asp.Net Web API以WebHost方式部署时,Asp.Net Web API的路由系统内部是怎样实现的.还是以一个简单实例开 ...
- ASP.NET Web API自身对CORS的支持:从实例开始
在<通过扩展让ASP.NET Web API支持W3C的CORS规范>中我们通过自定义的HttpMessageHandler为ASP.NET Web API赋予了跨域资源共享的能力,具体来 ...
- 【ASP.NET Web API教程】2.1 创建支持CRUD操作的Web API
原文 [ASP.NET Web API教程]2.1 创建支持CRUD操作的Web API 2.1 Creating a Web API that Supports CRUD Operations2.1 ...
- Asp.Net Web API 2(CRUD操作)第二课
Asp.Net Web API 2(CRUD操作)第二课 Asp.Net Web API 导航 Asp.Net Web API第一课:入门http://www.cnblogs.com/aehyok ...
- ASP.NET Web API 实例
ASP.NET Web API 入门大杂烩 创建Web API解决方案,命名为VCoinWebApi,并且创建了同名的Project,然后,创建一个Empty Project:Models,创建一个W ...
- ASP.NET Web API 框架研究 Controller实例的销毁
我们知道项目中创建的Controller,如ProductController都继承自ApiController抽象类,其又实现了接口IDisposable,所以,框架中自动调用Dispose方法来释 ...
- ASP.NET Web API实践系列02,在MVC4下的一个实例, 包含EF Code First,依赖注入, Bootstrap等
本篇体验在MVC4下,实现一个对Book信息的管理,包括增删查等,用到了EF Code First, 使用Unity进行依赖注入,前端使用Bootstrap美化.先上最终效果: →创建一个MVC4项目 ...
- 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用
由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...
随机推荐
- (转)Hive自定义UDAF详解
UDAF有两种,第一种是比较简单的形式,利用抽象类UDAF和UDAFEvaluator,暂不做讨论.主要说一下第二种形式,利用接口GenericUDAFResolver2(或者抽象类AbstractG ...
- 【Python】Python点滴(一)——pip工具使用
首先我们来看一条命令:pip install uwsgi 这条命令按照操作名称,可以分为三个部分:pip.install和uwsgi.接下来,按照这样三个部分进行分析. pip pip类似于Rea ...
- 用xapian来做索引
最近一个项目需要正则搜索MongoDB,400多万的数据一次查询要20s以上,需要建立一个前端索引服务.本着部署简单.开发容易的原则,找到了xapian这个索引库. 我使用的是Python的接口,xa ...
- 使用HttpURLConnection请求multipart/form-data类型的form提交
写一个小程序,模拟Http POST请求来从网站中获取数据.使用Jsoup(http://jsoup.org/)来解析HTML. Jsoup封装了HttpConnection的功能,可以向服务器提交请 ...
- canvas设置长宽
Canvas元素默认宽 300px, 高 150px, 设置其宽高可以使用如下方法:方法一:1 <canvas width="500" height="500&qu ...
- BZOJ2763 JLOI2011 飞行路线 【最短路+DP】
BZOJ2763 JLOI2011 飞行路线 Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n ...
- 20179223《Linux内核原理与分析》第五周学习笔记
视频内容知识学习 一.用户态.内核态和中断 1.内核态:处于高的执行级别下,代码可以执行特权指令,访问任意的物理地址,这时的CPU就对应内核态 2.用户态:处于低的执行级别下,代码只能在级别允许的特定 ...
- python scrapy ip代理的设置
在scrapy项目中建一个与spider同级的python目录并在下面添加一个py文件内容为 # encoding: utf-8import base64proxyServer = 代理服务器地址 # ...
- BW处理链(Process Chain)
处理链是能自动完成数据的处理和加载等操作的自动化工具. 1.创建处理链 输入T-code:RSPC打开操作界面,或者处理链已经在T-code:RSA1=>Modeling界面下,也可以直接单 ...
- jdk、jre、JVM的简单区别与联系
2015-10-20 23:08:52 (1)jdk Java development toolkit(开发工具包),JDK是整个JAVA的核心,包括了Java运行环境jre(Java Runtime ...