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方式
Post方式
三 在控制台中实现Get方式获取接口数据(只有异步实现)
四 在控制台中实现Post方式提交数据(只有异步实现)
五 在控制台中实现Put方式提交数据(只有异步实现)
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
刷新评论刷新页面返回顶部
回到目录
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
刷新评论刷新页面返回顶部
相关文章推荐
- WebApi系列~通过HttpClient来调用Web Api接口
- WebApi系列~通过HttpClient来调用Web Api接口~续~实体参数的传递
- Http下的各种操作类.WebApi系列~通过HttpClient来调用Web Api接口
- WebApi系列~通过HttpClient来调用Web Api接口~续~实体参数的传递
- WebApi系列~通过HttpClient来调用Web Api接口~续~实体参数的传递
- c# 【MVC】WebApi通过HttpClient来调用Web Api接口
- c# 【MVC】WebApi通过HttpClient来调用Web Api接口
- c# 【MVC】WebApi通过HttpClient来调用Web Api接口
- 通过HttpClient来调用Web Api接口
- WebApi系列~实际项目中如何使用HttpClient向web api发异步Get和Post请求并且参数于具体实体类型