您的位置:首页 > 理论基础 > 计算机网络

WebApi系列~通过HttpClient来调用Web Api接口

2016-10-27 19:54 459 查看
WebApi系列~通过HttpClient来调用Web Api接口

回到目录

HttpClient是一个被封装好的类,主要用于Http的通讯,它在.net,java,oc中都有被实现,当然,我只会.net,所以,只讲.net中的HttpClient去调用Web Api的方法,基于api项目的特殊性,它需要有一个完全安全的环境,所以,你的api控制器看起来有点特别,只有5个方法,而且都是标准的http方法,我觉得这种设计很不错,很清晰,而且为了实现安全性,它不支持使用传统的表单数据,取而代之的是FromBody参数,它指拿HttpRequestMessage里参数,而不是所有的Request数据,这是基于安全方面的考虑。

一 Api接口参数的标准性

Get方式,可以有多个重载,有多个参数

POST方式,只能有一个参数,并且用[FromBody]约束,如果有多个参数,需要以对象的方式进行传递

Put方式,只能有两个参数,其中一个是通过Request.QueryString方式进行传递的,作为要更新对象的主键,别一个是[FromBody]字段,也是一个字段,如果多个字段需要把它封装成对象

标准接口如图

二 调用方,参数的标准性

在客户端进行接口调用时,我们以网页端为例,看一下网页端进行ajax跨域请求的代码

Get方式

    $.ajax({
url: "http://localhost:52824/api/register",
type: "GET",
success: function (data) {
console.log("json:" + data);
}
});


Post方式

   $.ajax({
url: "http://localhost:52824/api/register",
type: "POST",
data: { '': '1' },//这里键名称必须为空,多个参数请传对象,api端参数名必须为value
success: function (data) {
console.log("post:" + data);
}
});


三 在控制台中实现Get方式获取接口数据(只有异步实现)

      /// <summary>
/// HttpClient实现Get请求
/// </summary>
static async void dooGet()
{
string url = "http://localhost:52824/api/register?id=1&leval=5";
//创建HttpClient(注意传入HttpClientHandler)
var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };

using (var http = new HttpClient(handler))
{
//await异步等待回应
var response = await http.GetAsync(url);
//确保HTTP成功状态值
response.EnsureSuccessStatusCode();

//await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,因为上面的AutomaticDecompression = DecompressionMethods.GZip)
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}


四 在控制台中实现Post方式提交数据(只有异步实现)

/// <summary>
/// HttpClient实现Post请求
/// </summary>
static async void dooPost()
{
string url = "http://localhost:52824/api/register";
var userId = "1";
//设置HttpClientHandler的AutomaticDecompression
var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
//创建HttpClient(注意传入HttpClientHandler)
using (var http = new HttpClient(handler))
{
//使用FormUrlEncodedContent做HttpContent
var content = new FormUrlEncodedContent(new Dictionary<string, string>()
{
{"", userId}//键名必须为空
});

//await异步等待回应

var response = await http.PostAsync(url, content);
//确保HTTP成功状态值
response.EnsureSuccessStatusCode();
//await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,因为上面的AutomaticDecompression = DecompressionMethods.GZip)
Console.WriteLine(await response.Content.ReadAsStringAsync());
}

}


五 在控制台中实现Put方式提交数据(只有异步实现)

/// <summary>
/// HttpClient实现Put请求
/// </summary>
static async void dooPut()
{
string url = "http://localhost:52824/api/register?userid=" + userId;
var userId = "1";
//设置HttpClientHandler的AutomaticDecompression
var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
//创建HttpClient(注意传入HttpClientHandler)
using (var http = new HttpClient(handler))
{
//使用FormUrlEncodedContent做HttpContent
var content = new FormUrlEncodedContent(new Dictionary<string, string>()
{
{"", "数据"}//键名必须为空
});

//await异步等待回应

var response = await http.PutAsync(url, content);
//确保HTTP成功状态值
response.EnsureSuccessStatusCode();
//await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,因为上面的AutomaticDecompression = DecompressionMethods.GZip)
Console.WriteLine(await response.Content.ReadAsStringAsync());
}

}


OK,到这里,我们的客户端如何去调用web api就讲完了,事实上,手机端,平板端也是相关的方式去调用的,它们也都有自己的HttpClient类,大同小异!

 回到目录

    支付宝扫一扫,为大叔打赏



作者:仓储大叔大叔博客园

出处:http://www.cnblogs.com/lori/ 欢迎转载,但任何转载必须保留完整文章,在显要地方显示署名以及原文链接。如您有任何疑问或者授权方面的协商,请给我留言

分类:
Web Api & CORS,面向服务,系统架构,异步和并行

好文要顶
关注我
收藏该文







张占岭
关注 - 37
粉丝 - 2512

+加关注

11
0

«
上一篇:EF架构~基于EF数据层的实现
»
下一篇:WebApi系列~通过HttpClient来调用Web Api接口~续~实体参数的传递

posted @ 2014-10-23 11:55
张占岭 阅读(36316) 评论(15)

编辑 收藏

评论列表

  
#1楼
2015-01-21 11:56
狐狸大仙
 

赞的~~~~

关于键名为空才能由webapi处理这事,官方文档上几乎没怎么提到。

饶了好多弯路
支持(0)反对(0)

  
#2楼
2015-03-17 10:26
lovememe
 

我想请教个问题,Silverlight怎么能实现,调用get、post、put、delete四中方式啊?js和客户端程序都没有问题,现在就差sl了。谢谢了,老师解答下呗。
支持(0)反对(0)

  
#3楼[楼主]
2015-03-17 11:40
张占岭
 

@ lovememe

没用过sl,它应该算是个客户端程序,运行在浏览器上,类似于app,你可以模拟一个Http请求,如可以使用HttpClient等类来产生一个http请求对象,然后使用它的post,get,put,delete等方法即可,这和在控制台程序上访问webapi的道理是一样的.
支持(0)反对(0) http://pic.cnblogs.com/face/118538/20160831224712.png
  
#4楼
2015-04-27 13:46
tekikesyo
 

大仙, 你的文章又一次帮了我,~~
支持(0)反对(0)

  
#5楼[楼主]
2015-04-27 18:20
张占岭
 

@ tekikesyo

能帮到你我也很高兴
支持(0)反对(0) http://pic.cnblogs.com/face/118538/20160831224712.png
  
#6楼
2015-06-03 01:00
宁淡禅心
 

您好,感谢您输出这样的好文章,我在学习您写的方法时候,调用api时候总是遇到

创建在“system.net/defaultProxy”配置节中指定的 Web 代理时出错。这个错误,一直没能解决~~~~不知道怎么处理好!
支持(0)反对(0)

  
#7楼
2015-07-06 10:02
xiongyl
 

楼主,ajax的跨域操作不是需要用到jsonp吗?您的那种写法应该是不可以的吧?
支持(0)反对(0)

  
#8楼[楼主]
2015-07-06 11:43
张占岭
 

@ xiongyl

一切皆有可能,人看看应该多看看cors的资料
支持(0)反对(0) http://pic.cnblogs.com/face/118538/20160831224712.png
  
#9楼
2015-09-20 18:51
garfieldzf
 

不知道你尝试过POST重载没?
支持(0)反对(0) http://pic.cnblogs.com/face/115511/20140604112233.png
  
#10楼
2015-10-27 17:30
zhongzhong11
 

今天用$.ajax跨域请求的时候总是获取不到数据,用 fiddler一看确实抓到了数据,但回到$.ajax函数中,直接触发了error,没有触发success,。用 apiclient或者浏览器直接访问都是ok的。请张老师指教
支持(0)反对(0)

  
#11楼[楼主]
2015-10-27 21:29
张占岭
 

@ zhongzhong11

默认情况下,AJAX跨域拿不到数据是正常的,除非你在服务端修改头信息,即cors共享资源。
支持(0)反对(0) http://pic.cnblogs.com/face/118538/20160831224712.png
  
#12楼
2015-10-28 09:06
zhongzhong11
 

谢谢张老师,已经解决了
支持(0)反对(0)

  
#13楼
2016-03-29 23:14
万大卫
 

你好,我在调用这个方法时FormUrlEncodedContent,需要传进去一张图片,用Convert.ToBase64String方法进行转换,但提示

其他信息: 无效的 URI: URI 字符串太长。查了很多信息都没解决,请问有什么办法吗。
支持(0)反对(0)

  
#14楼
2016-07-25 08:28
CodeL
 

请问,httpclient和httpwebrequest哪个性能好?
支持(0)反对(0) http://pic.cnblogs.com/face/882581/20160116140909.png
  
#15楼[楼主]34759382016/7/25
10:39:10 2016-07-25 10:39
张占岭
 

@ CodeL

我一般用前者,现在主要都是面向异步的了...
支持(0)反对(0) http://pic.cnblogs.com/face/118538/20160831224712.png
刷新评论刷新页面返回顶部
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: