关于操作 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中文网其它相关文章!

原文地址:https://www.cnblogs.com/cuihongyu3503319/p/9085809.html

时间: 2024-10-13 10:11:22

关于操作 ASP.NET Web API的实例的相关文章

探秘如何操作 ASP.NET Web API (一)

作者:Parry 出处:http://www.cnblogs.com/parry/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 这是一篇新手入门的一篇非常不错的文章,强烈推荐!联系我加微信:jkxx123321 或者关注微信公众号:爱享黑马 概述 REST(Representational State Transfer表述性状态转移)而产生的REST API的讨论越来越多,微软在ASP.NET中也添加了We

探秘如何操作 ASP.NET Web API (三)

经过我三篇文章的解惑,webapi我相信大家没有问题了! 先创建了一个UserModel public class UserModel { public string UserID { get; set; } public string UserName { get; set; } } 然后添加Web API Controller public class UserController : ApiController { public UserModel getAdmin() { return

ASP.NET Web API ----实例

上文ASP.NET Web API ----理论知识之后 实例 VS2013新建Web API,如下图: 参考的博客是使用的Entity Framework CodeFirst创建数据库,即下图的EF 6.X DbContext生成器. 本文是基于已经存在的数据库,创建ADO.NET实体数据模型,如下图: 添加控制器,如下图: 控制器有几个种类,创建继承ApiController的控制器,如下图: 建立一个对应类的控制器,路由寄宿在Web Host.这些代码VS自动生成在WebApiConfig

ASP.NET Web API实践系列02,在MVC4下的一个实例, 包含EF Code First,依赖注入, Bootstrap等

本篇体验在MVC4下,实现一个对Book信息的管理,包括增删查等,用到了EF Code First, 使用Unity进行依赖注入,前端使用Bootstrap美化.先上最终效果: →创建一个MVC4项目,选择Web API模版. →在Models文件夹创建一个Book.cs类. namespace MyMvcAndWebApi.Models { public class Book { public int Id { get; set; } public string Name { get; set

IoC在ASP.NET Web API中的应用

参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-get.html http://www.yuanjiaocheng.net/webapi/create-crud-api-1-post.html http://www.yuanjiaocheng.net/webapi/create-crud-api-1-put.html http://www.yuanjiaocheng.net/webapi/create-crud-api-1-

Asp.Net Web API 2第三课——.NET客户端调用Web API

Asp.Net Web API 导航 Asp.Net Web API第一课——入门http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web API第二课——CRUD操作http://www.cnblogs.com/aehyok/p/3434578.html 前言 本教程演示从一个控制台应用程序,使用HttpClient调用Web API.我们也将使用上一个教程中建立的Web API.你可以直接在http://www.cnblogs.com/

ASP.NET Web API 简介

ASP.NET Web API 简介 ASP.NET MVC 4 包含了 ASP.NET Web API, 这是一个创建可以连接包括浏览器.移动设备等多种客户端的 Http 服务的新框架, ASP.NET Web API 也是构建 RESTful 服务的理想平台. ASP.NET Web API 特性 ASP.NET Web API 包含下列特性: 先进的 HTTP 编程模型: 使用新的强类型的 HTTP 对象模型直接操作 HTTP 请求和响应, 在 HTTP客户端使用相同的编程模型和 HTTP

ASP.NET Web API 过滤器创建、执行过程(二)

前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器中,当然默认的基础服务也是有的,并且根据这些提供程序所获得的的过滤器信息集合进行排序.本篇就会对过滤器在创建完之后所做的一系列操作进行讲解. ASP.NET Web API 过滤器创建.执行过程(二) FilterGrouping过滤器分组类型 FilterGrouping类型是ApiController类型中的私有类型,它的作用就如同它的命名一样,用来对过

ASP.NET Web API 过滤器创建、执行过程(一)

前言 在上一篇中我们讲到控制器的执行过程系列,这个系列要搁置一段时间了,因为在控制器执行的过程中包含的信息都是要单独的用一个系列来描述的,就如今天的这个篇幅就是在上面内容之后所看到的一个知识要点之一. ASP.NET Web API 过滤器创建.执行过程(一) 下面就来讲解一下在ASP.NET Web API框架中过滤器的创建.执行过程. 过滤器所在的位置 图1 图1所示的就是控制器执行过程很粗略的表示. 通过上一篇内容我们了解到控制器方法选择器最后返回的并不是控制器方法,而是对于控制器方法描述