Web API WinForm使用HttpClient呼叫Web API
前言
之前几篇文章已经介绍了 Web 与 Web API 的使用方式,接下来将介绍如何在 Windows Form 呼叫 Web API 的方法,要在 WinForm 中使用 Web API 的话,除了可以使用旧有的 WebClient、HttpWebRequest 类别之外,还可以使用新的 HttpClient 类别进行操作,HttpClient 类别是包含在 .Net Framework 4.5 中的 System.Net.Http 之命名空间底下,HttpClient 类别一般来说需要在 .Net Framework 4.5 上才能够使用,但是如果有装 NuGet 的话,可以使用 NuGet 搜寻 Microsoft.Net.Http,NuGet 有提供 4.0 可以使用的安装包。
HttpClient 简介
在开始使用 WinForm 操作 Web API 前先来介绍一下 HttpClient 类别,HttpClient 类别主要使用于发送 HTTP 要求与接收 HTTP 响应内容,其中包含了一个特点,就是使用异步方式发送 GET、POST、PUT、DELETE 要求,在 MSDN HttpClient 类别文件中提到,使用 HttpClient 的每个请求都拥有各自的连接集区,每个连接集区并不会互相干扰,意思就是可以使用一个实体化的 HttpClient 对象发送给各个不同的 HTTP 服务而不会相互影响。
HttpClient 能够自订自己的 HttpClient Handler,需要透过继承 DelegatingHandler 的方式并覆写其 SendAsync 方法,参考此 HttpClient Message Handlers文章提到,通常一个服务程序接收到了一个请求并处理其相关内容再回复结果,而过程中可能会经过数个 Handler 层层传递,这种处理模式称为 Delegating Handler,如下图:

在客户端 HttpClient 透过消息处理程序来处理请求时,默认使用的是 HttpClientHandler 发送请求并得到服务响应,所以我们可以在此将自订的 Message Handler 插入到 HttpClient 与服务之间,如下图,但是在这里不特别说明作法而日后将另辟文章说明,另外对于 Web API 也能够自订Http Message Handler。

使用 HttpClient
经过以上描述应该对于 HttpClient 有了大概的了解,接下来就来在 Windows Form 里使用 HttpClient 类别操作呼叫 Web API 吧,同样使用前几篇建立好的 Web API 做为基底然后再加入一个窗口应用程序,如下图步骤


接下来接可以加入一个 Windows Form,简单的把要使用的控制箱加入后切换到程序代码检视,准备开始撰写相关代码。


例如当需要取得 Web API 的所有产品清单时,就可以撰写 GetAllProducts() 方法,如下
1.private async void GetAllProducts()2.{3.HttpClient client = new HttpClient();5.response.EnsureSuccessStatusCode();6.string responseBody = await response.Content.ReadAsStringAsync();7.ShowResult(JsonConvert.DeserializeObject<List<Product>>(responseBody));8.}在以上方法中可以看到于方法宣告中加入了 async 宣告此方法为异步方法,之后产生了 HttpClient 对象,并透过该对象的 GetAsync(string) 方法使用异步作业要求取得此 URI 资源,GetAsync(string) 方法将发送一个 GET 请求至 Web API 服务并返回结果,这里可以注意到在 client.GetAsync(URL) 前面加了一个 await 关键词,其原因在于 HttpClient 是异步方法,所以必须要求等待到数据处理完成返回后才能继续下面的步骤,如果不加 await 关键词于前方,GetAsync(string) 方法预设是返回一个 Task<TResult> 的型别。
而如需要使用 POST 动词的方式呼叫 Web API,就需要改使用 PostAsync(string, httpContent) 方法,如下
1.private async void PostProduct()2.{3.HttpClient client = new HttpClient();4.HttpResponseMessage response = await client.PostAsync("http://localhost:49988/api/products/ASP.NET/WEB/399/12", null);5.response.EnsureSuccessStatusCode();6.string responseBody = await response.Content.ReadAsStringAsync();7.ShowResult(JsonConvert.DeserializeObject<List<Product>>(responseBody));8.}在以上方法中使用 PostAsync(string, httpContent) 方法处理 Post 传输,在此 HttpContent 参数为 null 的原因在此 Web API 的服务是使用 URI 资源的形式,会将参数都至于此 URI 位置中,所以当不是使用此方式的情况下,就必须要自行将参数写入 HttpContent。
而 Put、Delete 就如同上述内容一样做法,如下
01.private async void PutProduct()02.{03.HttpClient client = new HttpClient();04.HttpResponseMessage response = await client.PutAsync("http://localhost:49988/api/products/1/The WebAPI/MVC/450/5", null);05.response.EnsureSuccessStatusCode();06.string responseBody = await response.Content.ReadAsStringAsync();07.ShowResult(JsonConvert.DeserializeObject<List<Product>>(responseBody));08.}09. 10.private async void DeleteProductById()11.{12.HttpClient client = new HttpClient();13.HttpResponseMessage response = await client.DeleteAsync("http://localhost:49988/api/products/2");14.response.EnsureSuccessStatusCode();15.string responseBody = await response.Content.ReadAsStringAsync();16.ShowResult(JsonConvert.DeserializeObject<List<Product>>(responseBody));17.}参考以上内容完成后,就可以来测试一下,如下

以上就是一个 Windows Form 使用 HttpClient 呼叫 Web API 的使用范例,如有任何遗漏或错误,日后将继续修正补充。
范例程序代码http://down1.it165.net/down/201306/it165.net_0603TWebApi.rar
Web API WinForm使用HttpClient呼叫Web API的更多相关文章
- 【ASP.NET Web API2】利用HttpClient调用Web API(TODO)
参照: 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用 纯属记录一下遇到的问题: 我们利用HttpClient来调用自宿主方式寄宿的Web API.HttpCl ...
- 【WEB API项目实战干货系列】- API访问客户端(WebApiClient适用于MVC/WebForms/WinForm)(四)
这几天没更新主要是因为没有一款合适的后端框架来支持我们的Web API项目Demo, 所以耽误了几天, 目前最新的代码已经通过Sqlite + NHibernate + Autofac满足了我们基本的 ...
- angularjs呼叫Web API
今早有分享一篇<创建Web API并使用>http://www.cnblogs.com/insus/p/7771428.html 接下来,我再分享一篇,怎样在angularjs去呼叫Web ...
- Web API(二):Web API概述
一.什么是API API(Application Programming Interface)即应用程序编程接口,是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能 ...
- 【转载】ASP.NET MVC Web API 学习笔记---第一个Web API程序
1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过 ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序
http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...
- Asp.Net Web API 2第五课——Web API路由
Asp.Net Web API 导航 Asp.Net Web API第一课——入门 http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序【转】
http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html 1. Web API简单说明 近来很多大型的平台都公开了Web API. ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序---近来很多大型的平台都公开了Web API
1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过 ...
随机推荐
- unity 内存中切割图片
一般的说我们切割图片是将一张图片资源切割成更小的图片资源,也就是说在资源上就进行了切割,比如ugui上的切割方法. 如果我们有一些情况比如做拼图,可能让玩家自己选择自己的生活照作为拼图的原图. 那么我 ...
- css3 animation-fill-mode 对布局的影响
问题描述:在小米手机上,animation-fill-mode设置为 both时,在手机上的web页面会超出屏幕宽度,出现滚动条. 解决方法:animation-fill-mode设为none. .p ...
- Python之路,day7-Python基础
os.system 输出命令结果到屏幕,返回命令执行状态os.popen("dir").read()#会保存命令的执行结果输出py2.7commandscommands.getst ...
- u-boot-2010.09移植(B)
前面我们的u-boot只是在内存中运行,要想在nandflash中运行,以达到开机自启的目的,还需作如下修改 一.添加DM9000网卡支持 1.修改board/fl2440/fl2440.c中的boa ...
- netflix:Conductor微服务编排引擎
项目地址: https://github.com/Netflix/conductor Conductor 是 Netflix 受需要运行全球流媒体业务流程的启发,构建的基于云的微服务编排引擎. Con ...
- consul 安装
1. linux 下consul 安装 首先查看机器信息: uname -a Linux centos-linux.shared 3.10.0-327.el7.x86_64 #1 SMP Thu No ...
- PHP list,explode的使用
PHP list,explode的使用 <?php header("Content-type: text/html; charset=utf-8"); echo " ...
- winform导入导出excel,后台动态添加控件
思路: 导入: 1,初始化一个OpenFileDialog类 (OpenFileDialog fileDialog = new OpenFileDialog();) 2, 获取用户选择文件的后缀名(s ...
- 百度地图api2.0体验
前言:这两天在做百度地图的功能,查看了百度官网的api完成了基本功能 api地址http://developer.baidu.com/map/jshome.htm 注意是javascript API ...
- 如何通过SerialPort读取和写入设备COM端口数据
SerialPort类用于控制串行端口文件资源.提供同步 I/O 和事件驱动的 I/O.对管脚和中断状态的访问以及对串行驱动程序属性的访问.另外,SerialPort的功能可以包装在内部 Stream ...