WebAPI是标准的Http协议,支持Http协议的客户端(如浏览器)都可以访问。但是,有的时候我们如果想在自己的程序中使用WebAPI时,此时就要实现自己的客户端了。我之前介绍过在.Net 4.5中新增的HttpClient库,它对Http操作实现了非常好的封装。我们可以通过它实现Http访问,例如,我们对前文所示的API进行一次Post操作:

// POST: api/Values
    public
void Post(Product value)
    {
    }

首先对HttpClient进行一些初始化操作:

var client = new
HttpClient();

client.BaseAddress = new
Uri("http://localhost:1282/");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new
MediaTypeWithQualityHeaderValue("application/json"));

这里主要进行了两部操作:1. 定义了默认的基地址,减少后续的URL长度,2. 定义了默认的接受的数据类型为Json。

下一步就要开始对Product对象的内容编码,默认是xml或json,这里我选择相对简单的json:

var product = new
Product() { Id = 1, Name = "food" };
    var content = Newtonsoft.Json.JsonConvert.SerializeObject(product);

var httpContent = new
StringContent(content, Encoding.UTF8);
    httpContent.Headers.ContentType = new
MediaTypeHeaderValue("application/json") { CharSet = "utf-8" };
    await httpContent.LoadIntoBufferAsync();
    var rsp = await client.PostAsync("api/values", httpContent);

从上面的代码可以看出,由于WebAPI不像WCF那样能自动生成客户端代码,需要我们自己封装对象,上面光封装对象就用了四行代码,对于不熟悉HttpClientd 朋友来说还是比较容易出错的。因此微软提供了一系列扩展函数方便我们简化这一过程。

在NUGET中安装WebApi.Client库

这个库安装后会在引用中增加一个System.Net.Http.Formatting的程序集,它主要提供了一系列扩展函数(其实装这个库顺带也会把HttpClient和Json.Net一并岸上),现在上面的代码就可以简化如下了:

var product = new
Product() { Id = 1, Name = "food" };
    var rsp = await client.PostAsJsonAsync("api/values", product);

除了PostAsJsonAsync这个扩展函数外,还提供了PostAsXmlAsync这种以XML传输的方式。同样,Put也有PutAsJsonAsync和PutAsXmlAsync的扩展版本。对于Get,虽然也提供了扩展函数,但是使用的方式稍有不同:

var rsp = await client.GetAsync("api/values/1");
    rsp.EnsureSuccessStatusCode();
    var product = await rsp.Content.ReadAsAsync<Product>();

对于Delete,却没有提供扩展函数,可能是官方认为Delete直接在URL中就传ID就够用了,没必要在Request中封装消息了吧。

限于篇幅,今天就介绍到这里了,更多内容的可以参看官方文档:http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client

 
 
 

使用ASP.Net WebAPI构建REST服务(五)——客户端的更多相关文章

  1. 使用ASP.Net WebAPI构建REST服务(一)——简单的示例

    由于给予REST的Web服务非常简单易用,它越来越成为企业后端服务集成的首选方法.本文这里介绍一下如何通过微软的Asp.Net WebAPI快速构建REST-ful 服务. 首先创建一个Asp.Net ...

  2. 使用ASP.Net WebAPI构建REST服务(三)——返回值

    Asp.Net WebAPI服务函数的返回值主要可以分为void.普通对象.HttpResponseMessag.IHttpActionResult e四种,本文这里简单的介绍一下它们的区别. 一.返 ...

  3. 使用ASP.Net WebAPI构建REST服务(六)——Self-Host

    Asp.Net WebAPI生成的是一个程序集,并不是独立的进程,因此,要运行的时候必须将其承载在相应的宿主上,一般比较常见的是IIS承载.很多时候,我们为了简化部署或者功能集成,需要将其承载到独立的 ...

  4. 使用ASP.Net WebAPI构建REST服务(四)——参数绑定

    默认绑定方式 WebAPI把参数分成了简单类型和复杂类型: 简单类型主要包括CLR的primitive types,(int.double.bool等),系统内置的几个strcut类型(TimeSpa ...

  5. 使用ASP.Net WebAPI构建REST服务(二)——路由

    REST并没有像传统的RPC服务那样显式指定了服务器函数的访问路径,而是将URL根据一定的规则映射为服务函数入口,这个规则就称之为路由.Asp.Net WebAPI的路由方式和Asp.Net MVC是 ...

  6. 使用Asp.net WebAPI 快速构建后台数据接口

    现在的互联网应用,无论是web应用,还是移动APP,基本都需要实现非常多的数据访问接口.其实对一些轻应用来说Asp.net WebAPI是一个很快捷简单并且易于维护的后台数据接口框架.下面我们来快速构 ...

  7. 基于OWIN ASP.NET WebAPI 使用OAUTH2授权服务的几点优化

    前面在ASP.NET WEBAPI中集成了Client Credentials Grant与Resource Owner Password Credentials Grant两种OAUTH2模式,今天 ...

  8. ASP.NET WebAPI 生成帮助文档与使用Swagger服务测试

    帮助HELP 要实现如WCF中的Help帮助文档,Web API 2 中已经支持很方便的实现了这一特性  http://www.asp.net/web-api/overview/creating-we ...

  9. 【开源】分享一个前后端分离方案-前端angularjs+requirejs+dhtmlx 后端asp.net webapi

    一.前言 半年前左右折腾了一个前后端分离的架子,这几天才想起来翻出来分享给大家.关于前后端分离这个话题大家也谈了很久了,希望我这个实践能对大家有点点帮助,演示和源码都贴在后面. 二.技术架构 这两年a ...

随机推荐

  1. silverlighter下MVVM模式中利用Behavior和TargetedTriggerAction实现文本框的一些特效

    在silverlight一般开发模式中,给文本框添加一些事件是轻而易举的,然而MVVM开发模式中,想要给文本框添加一些事件并非那么容易,因为MVVM模式中,只有ICommand接口,而且也只有Butt ...

  2. 2016暑假多校联合---To My Girlfriend

    2016暑假多校联合---To My Girlfriend Problem Description Dear Guo I never forget the moment I met with you. ...

  3. iOS:使用MVC模式帮ViewController瘦身

    如何给UIViewController瘦身 随着程序逻辑复杂度的提高,你是否也发现了App中一些ViewController的代码行数急剧增多,达到了2,3千行,甚至更多.这时如果想再添加一点功能或者 ...

  4. XCODE shouldAutorotateToInterfaceOrientation 对于不同版本 设备旋转不同方向时 视图的相应旋转方向的实现

    对于版本号不同的设备,旋转时视图的要做出相应的旋转,那么版本不同,代码的实现是如何的,如何对旋转方向做出限制?下面是小编的个人看法! //版本号为3.5 -5.0 -(BOOL)shouldAutor ...

  5. NOIP欢乐模拟赛 T1 解题报告

    小澳的方阵 (matrix.cpp/c/pas) [题目描述] 小澳最近迷上了考古,他发现秦始皇的兵马俑布局十分有特点,热爱钻研的小澳打算在电脑上还原这个伟大的布局. 他努力钻研,发现秦始皇布置兵马俑 ...

  6. 转: jdbc连接数据库需要注意和出错的地方

    * 1.数据库登录模式不能只使用windows登录模式,要采取混合模式登录, * 并记住相应的密码和账户: * 2.连接数据库后一定要记得关闭资源,否则就会造成资源浪费. * 关闭的时候也要注意顺序, ...

  7. PLSQL 逻辑多线程机制

    CREATE OR REPLACE PACKAGE jv_para_pkg IS PROCEDURE main(i_job_name   VARCHAR2,                 i_job ...

  8. NodeJS路径的小问题

    今天从新过了一边node的基础知识,自己写了一个小例子: foo.js exports.setSome = function (x) {return x }; saveData.js /** * Cr ...

  9. 3DTouch-ShortcutItem - iOS9 - xcode7

    据说苹果某个神秘的团队闭门潜心研发多年的3DTouch终于,应用在iOS9上,且公开了API. 在系统主界面用力按压 APP 图标,如上会出现自定义菜单 有两种方法可以实现一.代码(这种方法也是可以动 ...

  10. STC-ISP下载过程