添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在.NET 4.0和C# 4.0的时代,写成异步的话,这将会写比较多的代码,而且我保证代码不会很好看,因为一大堆APM异步执行代码的结果就是要么一层一层的嵌套Lambda,要么一段逻辑被迫分割成一堆方法。

另一个之前的缺陷就是用户必须手动把URL参数编码并且正确连接然后放入到HTTP请求中,而.NET 4.5中的HttpContent类型的多个派生类型可以支持更快捷的HTTP数据内容创建,我们可以使用FormUrlEncodedContent来完成上述需求。

另一个就是自动解压缩HTTP回应中的GZIP,.NET 4.0中在HttpWebRequest的AutomaticDecompression属性中,在.NET 4.5中的HttpClient类型中,可以使用HttpClientHandler的AutomaticDecompression属性,前后两者对应值都是DecompressionMethods枚举类型,这个类型在.NET 2.0就有了。因此命名空间在System.Net中。

我们可以拿一个API来做演示,整个代码如下:

//+ using System.Net;

//+ using System.Net.Http;

static void Main ( string [] args )

doo ();

System . Threading . Thread . Sleep ( - 1 );

static async void doo ()

//设置必要参数

//示例API可以参考:http://dev.jiepang.com/doc/get/users/show

var url = "http://api.jiepang.com/v1/users/show" ;

var userId = "772653441" ;

var source = "Mgen.Orca" ;

//设置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 > ()

{ "id" , userId },

{ "source" , source },

{ "force_gzip" , "1" }

//await异步等待回应

var response = await http . PostAsync ( url , content );

//确保HTTP成功状态值

response . EnsureSuccessStatusCode ();

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

Console . WriteLine ( await response . Content . ReadAsStringAsync ());

运行后,有网络的话会输出账号的Json信息!

上述API使用了一个显示参数来指定需要返回GZIP数据回应,也可以通过设置HTTP请求的AcceptEncoding,如下,手动加入GZIP类型:

//http是HttpClient对象

//也可以手动构建HttpRequestMessage,然后通过HttpClient.SendAsync来发送

http . DefaultRequestHeaders . AcceptEncoding . Add ( new StringWithQualityHeaderValue ( "GZIP" ));

http是HttpClient对象,它的DefaultRequestHeaders返回HttpRequestHeaders对象。当然也可以手动构建HttpRequestMessage然后修改HttpRequestHeaders,然后通过HttpClient.SendAsync来发送。

点击打开链接

项目中遇到了这样的问题: 第一次 :HttpResponseMessage response = await httpClient . Post Async(url, null); 发送 了一个 post 异步 请求 ,操作了一个datatable的数据 第二次:又发了一个 post 异步 请求 ,用到了第一步中的datatable的数据 刚开始都是 异步 方式调用,发现最终结果有时候对,有时候不对,调试才发现是两次异... 因为参数数据多,可以将参数转换成string,然后利用 GZIP OutputStream进行压缩 try { List nameValuePairs = params.getBodyParam 最简单的方法是 使用 内置的automatic de compression 和HttpWebRequest类。var request = (HttpWebRequest)HttpWebRequest.Create("http://stackoverflow.com");request.Headers.Add(HttpRequestHeader.AcceptEncoding, " gzip ,deflate"... 前言在上篇文章[ASP.NET Core中的响应压缩]中我们谈到了在ASP.NET Core服务端处理关于响应压缩的 请求 ,服务端的主要工作就是根据Content-Encoding... Gzip : Gzip 基于 DEFLATE 算法,它是 LZ77 和霍夫曼编码的组合,最早用于 UNIX 系统的文件压缩。HTTP 协议上的 Gzip 编码是一种用来进 Web 应用程序性能的技术,Web 服务器和客户端(浏览器)必须共同支持 Gz 本部分参考:《WebClient, HttpClient , HttpWebRequest ,RestSharp之间的区别与抉择》 使用 .net 平台原生提供的HttpWebRequest、WebClient和 HttpClient 使用 开源的工具,如:RestSharp、Flurl。 在.net core平台下已经不推荐 使用 HttpWebRequest、WebClient方式了 最近参与了公司的一个和微信平台相关的项目,最近加班加点和第三方调接口。接口走的是http协议,对方返回数据格式为json格式。现在记录下用到的一些知识,以便以后方便查阅。c#真是方便,可以通过JavaScriptSerializer类实现对json数据转化为对象,将对象转化为json串 对方大概提供了两种类型的接口: 一种是直接访问url便可获得数据,一种是要我这边组织json格式的数据再po 使用 http1.1访问https时遇到的问题 问题1、访问不到数据,这时首先要设置 HttpClient 的证书 HttpClient httpClient = get HttpClient (); //看后面的附加代码 HttpResponse httpResponse = httpClient .execute(httpRequest); 问题2、 请求 到的数据过大,这种情况,可以 使用 HttpResponse response = httpClient .execute(http); Header[] headers = response.getHeaders("Content-Encoding"); boolean is Gzip import org.apache.commons. httpclient . HttpClient ;   import org.apache.commons. httpclient .HttpStatus;