在.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;