那一个类型深切的为我们讲解了pc客户端如何请求webapi
相信我们在看了本身转发的首先篇文章和那篇小说之后,对webapi再也不会惧怕了!


 

议论webapi的学识,欢迎加小编微信 
jkxx1233贰1 调换


 

 

WCF的野心造成了它的巨大复杂,HTTP的可是作育了它的简约卓绝。为了贯彻分布式Web应用,大家只可以将双方凑合在1起
—— WCF服务以HTTP绑定宿主于IIS。

 

于是乎有了令人晕头转向的配备、令人郁闷不已的调节,还有那ServiceContract,
DataContract, EnumMember…还有还有,永不在using语句中调用WCF服务

 

于是时常自问:拿着牛刀削苹果有不可或缺吗?废话,当然未有须要,水果刀在哪儿?

 

微软望着那样几个人拿着牛刀削苹果,自个儿也看不下去了,于是,1种水果刀横空出世—— ASP.NET Web API。

 

新近大家在实质上支付中有个地方用WCF太辛劳,就小规模试制了一晃水果刀,感觉勉强能够。

 

上面用一个简单易行的示范分享一下ASP.NET Web API水果刀的用法。

 

服务端ASP.NET Web API的实现

 

亟待有备无患的工具:Visual Studio 2010, NuGet

 

  1. 新建3个空的ASP.NET Web Application项目。

 

XML 1

 

  1. 透过NuGet添加ASP.NET Web
    API的引用,在NuGet中寻找时要用“AspNetWebApi”(用“ASP.NET Web
    API”是寻觅不到的),然后选用ASP.NET Web API(Beta)进行设置。

 

XML 2

 

  1. 添加Global.asax,在Application_Start中注册Web
    API的路由,在Global.asax.cs中添加如下代码:

 

protected void Application_Start(object sender, EventArgs e)
{
    RouteTable.Routes.MapHttpRoute("WebApi", "api/{controller}/{action}/{id}", 
        new { id = RouteParameter.Optional });
}

 

四.
添加Controllers文件夹,在里边添加类文件德姆oController.cs,并让德姆oController继承自ApiController。代码如下:

 

XML 3

namespace CNBlogsWebApiDemo.Controllers
{
    public class DemoController : ApiController
    {
    }
}

XML 4

 

  1. 添加ViewModels文件夹,在中间添加Site.cs,并定义Site。

 

XML 5

namespace CNBlogsWebApiDemo.ViewModels
{
    public class Site
    {
        public int SiteId { get; set; }
        public string Title { get; set; }
        public string Uri { get; set; }
    }
}

XML 6

 

六.
给德姆oController添加七个措施SiteList,并写上大家的言传身教代码。代码如下:

 

XML 7

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 sites
                        where site.SiteId > startId
                        select site)
                        .Take(itemcount)
                        .ToList();
        return result;
    }
}

XML 8

 

  1. 布局一下Web项目标起步设置Specific Page与Specific port

 

XML 9

 

  1. Ctrl+F5周转项目,结果如下:

 

XML 10

 

结果是我们盼望的,用浏览器直接能够查看Web
API的运营结果,测试时会很便利。

 

好了,服务端Web API就像此轻松化解了!

 

客户端通过HttpClient调用服务端Web API

 

  1. 新建七个WebApiTest的类库项目。

 

  1. 在NuGet中添加System.Net.Http(HttpClient就在那边), Json.NET,
    xUnit.net。

XML, 

  1. 添加类文件WebApiClientTest.cs,添加测试方法WebApi_SiteList_Test:

 

XML 11

namespace WebApiClientTest
{
    public class WebApiClientTest
    {
        [Fact]
        public void WebApi_SiteList_Test()
        {

        }
    }
}

XML 12

 

4. WebApi_SiteList_Test() 的代码实现

 

四.一 首先,要明确四个东西:

 

  a) 客户端调用WebAPI的不贰秘籍是Http Get,还Http Post,我们那边接纳Http
Post;

 

  b) 客户端调用WebAPI时传递的参数格式,大家这里采用的是Json。

 

  c) WebAPI再次来到的数量格式,大家那里选择的也是Json(那也是从前添加Json.NET引用的来由)。

 

四.2 用到的类

 

  • System.Net.Http.HttpClient
  • System.Net.Http.httpContent
  • System.Net.Http.StringContent
  • System.Net.Http.Headers.MediaTypeHeaderValue
  • Newtonsoft.Json.JsonConvert

 

肆.3 准备须要传递给WebAPI的参数

 

  供给传递的四个参数是startId
,itemcount,传递的格式是Json。那里可未有Javascript中的JSON.stringify(),但大家有Json.NET,再添加匿名类型,有点用js的感觉,代码如下:

 

var requestJson = JsonConvert.SerializeObject(new { startId = 1, itemcount = 3 });

 

  代码的周转结果:{“startId”:一,”itemcount”:3}

 

  然后用System.Net.Http.StringContent把它打个包:

 

HttpContent httpContent = new StringContent(requestJson);

 

  然后设置一下ContentType:

 

httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

 

四.四 通过Http Post调用WebAPI获得重回结果

 

  HttpClient闪亮登场,调用它的PostAsync()方法轻松化解:

 

var httpClient = new HttpClient();
var responseJson = httpClient.PostAsync("http://localhost:9000/api/demo/sitelist", httpContent)
    .Result.Content.ReadAsStringAsync().Result;

 

  看一下responseJson的结果:

 

[{"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的魔力之一 —— 3回达成,按需服务。

 

四.5 将Json格式重回的结果反种类化为强类型

 

  Json.NET又登场:

 

var sites = JsonConvert.DeserializeObject<IList<Site>>(responseJson);

 

  体现一下再次回到结果:

 

  代码

 

sites.ToList().ForEach(x => Console.WriteLine(x.Title + ":" + x.Uri));

 

  结果  

 

  博客园首页:www.cnblogs.com
  博问:q.cnblogs.com
  新闻:news.cnblogs.com

 

4.6 WebApi_SiteList_Test() 完整兑现代码

 

XML 13

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));
    }
}

XML 14

 

注:运转这里的代码此前,要先运转WebAPI项目,先把劳务跑起来,客户端才能享受到劳动。

 

与jQuery ajax调用代码比较一下:

 

XML 15

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/>');
        });
    }
});

XML 16

 

注:上边的代码是可实际运行的啊,代码在演示代码WebApi德姆o项指标AjaxWebApi.htm文件中。那也是ASP.NET
Web API “2回完结,按需服务”的反映。

 

小结 

 

水果刀(ASP.NET Web
API)用下来感觉还不易,不仅可以削苹果,还是能削梨子,切青门绿玉房也无足挂齿。用不用牛刀(WCF),还得多思索思考。

 

相关文章

网站地图xml地图