0%

HttpWeb

HttpWebRequest

命名空间: System.Net,这是.NET创建者最初开发用于使用HTTP请求的标准类
使用HttpWebRequest可以让开发者控制请求/响应流程的各个方面,如 timeouts, cookies, headers, protocols
另一个好处是HttpWebRequest类不会阻塞UI线程,例如,当从响应很慢的API服务器下载大文件时,您的应用程序的UI不会停止响应
HttpWebRequest通常和WebResponse一起使用,一个发送请求,一个获取数据
HttpWebRquest更为底层一些,能够对整个访问过程有个直观的认识,但同时也更加复杂一些

属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Accept //获取或设置 Accept HTTP 标头的值。
Address //获取实际响应请求的 Internet 资源的统一资源标识符 (URI)。
AllowAutoRedirect //获取或设置一个值,该值指示请求是否应跟随重定向响应。
AllowReadStreamBuffering //获取或设置一个值,该值指示是否对从 Internet 资源接收的数据进行缓冲处理。
AllowWriteStreamBuffering //获取或设置一个值,该值指示是否对发送到 Internet 资源的数据进行缓冲处理。
AuthenticationLevel //获取或设置用于此请求的身份验证和模拟的级别。(继承自 WebRequest)
AutomaticDecompression //获取或设置所使用的解压缩类型。
CachePolicy //获取或设置此请求的缓存策略。(继承自 WebRequest)
ClientCertificates //获取或设置与此请求关联的安全证书集合。
Connection //获取或设置 Connection HTTP 标头的值。
ConnectionGroupName //获取或设置请求的连接组的名称。
ContentLength //获取或设置 Content-length HTTP 标头。
ContentType //获取或设置 Content-type HTTP 标头的值。
ContinueDelegate //获取或设置当从 Internet 资源接收到 HTTP 100-continue 响应时调用的委托方法。
ContinueTimeout //获取或设置在接收到来自服务器的 100-Continue 之前要等待的超时(以毫秒为单位)。
CookieContainer //获取或设置与请求关联的 Cookie。
CreatorInstance //当在子类中重写时,获取从 IWebRequestCreate 类派生的工厂对象,该类用于创建为生成对指定 URI 的请求而实例化的 WebRequest。(继承自 WebRequest)
Credentials //获取或设置请求的身份验证信息。
Date //获取或设置要在 HTTP 请求中使用的 Date HTTP 标头值。
DefaultCachePolicy //获取或设置此请求的默认缓存策略。
DefaultMaximumErrorResponseLength //获取或设置 HTTP 错误响应的默认最大长度。
DefaultMaximumResponseHeadersLength //获取或设置 MaximumResponseHeadersLength 属性的默认值。
Expect //获取或设置 Expect HTTP 标头的值。
HaveResponse //获取一个值,该值指示是否收到了来自 Internet 资源的响应。
Headers //指定构成 HTTP 标头的名称/值对的集合。
Host //获取或设置要在 HTTP 请求中独立于请求 URI 使用的 Host 标头值。
IfModifiedSince //获取或设置 If-Modified-Since HTTP 标头的值。
ImpersonationLevel //获取或设置当前请求的模拟级别。(继承自 WebRequest)
KeepAlive //获取或设置一个值,该值指示是否与 Internet 资源建立持续型连接。
MaximumAutomaticRedirections //获取或设置请求将跟随的重定向的最大数目。
MaximumResponseHeadersLength //获取或设置响应标头允许的最大长度。
MediaType //获取或设置请求的媒体类型。
Method //获取或设置请求的方法。
Pipelined //获取或设置一个值,该值指示是否通过管线将请求传输到 Internet 资源。
PreAuthenticate //获取或设置一个值,该值指示是否随请求发送一个 Authorization 标头。
ProtocolVersion //获取或设置用于请求的 HTTP 版本。
Proxy //获取或设置请求的代理信息。
ReadWriteTimeout //获取或设置写入或读取流时的超时(以毫秒为单位)。
Referer //获取或设置 Referer HTTP 标头的值。
RequestUri //获取请求的原始统一资源标识符 (URI)。
SendChunked //获取或设置一个值,该值指示是否将数据分段发送到 Internet 资源。
ServerCertificateValidationCallback //获取或设置用于验证服务器证书的回调函数。
ServicePoint //获取用于请求的服务点。
SupportsCookieContainer //获取指示请求是否为 CookieContainer 提供支持的值。
Timeout //获取或设置 GetResponse() 和 GetRequestStream() 方法的超时值(以毫秒为单位)。
TransferEncoding //获取或设置 Transfer-encoding HTTP 标头的值。
UnsafeAuthenticatedConnectionSharing //获取或设置一个值,该值指示是否允许经过高速 NTLM 身份验证的连接共享。
UseDefaultCredentials //获取或设置一个 Boolean 值,该值控制是否随请求一起发送默认凭据。
UserAgent //获取或设置 User-agent HTTP 标头的值。

方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Abort() //取消向 Internet 资源发出的请求。
AddRange(Int32) //向请求添加从请求数据的开始处或结束处的特定范围的字节范围标头。
AddRange(Int32, Int32) //向请求添加指定范围的字节范围标头。
AddRange(Int64) //向请求添加从请求数据的开始处或结束处的特定范围的字节范围标头。
AddRange(Int64, Int64) //向请求添加指定范围的字节范围标头。
AddRange(String, Int32) //向请求添加从请求数据的开始处或结束处计算的特定范围的 Range 标头。
AddRange(String, Int32, Int32) //向请求添加指定范围的范围标头。
AddRange(String, Int64) //向请求添加从请求数据的开始处或结束处计算的特定范围的 Range 标头。
AddRange(String, Int64, Int64) //向请求添加指定范围的范围标头。
BeginGetRequestStream(AsyncCallback, Object) //开始对用于写入数据的 Stream 对象执行异步请求。
BeginGetResponse(AsyncCallback, Object) //开始对 Internet 资源的异步请求。
CreateObjRef(Type) //创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。(继承自 MarshalByRefObject)
EndGetRequestStream(IAsyncResult) //结束对用来写入数据的 Stream 对象的异步请求。
EndGetRequestStream(IAsyncResult, TransportContext) //结束对用于写入数据的 Stream 对象的异步请求,并输出与该流关联的 TransportContext。
EndGetResponse(IAsyncResult) //结束对 Internet 资源的异步请求。
Equals(Object) //确定指定的对象是否等于当前对象。(继承自 Object)
GetHashCode() //作为默认哈希函数。(继承自 Object)
GetLifetimeService() //检索控制此实例的生存期策略的当前生存期服务对象。(继承自 MarshalByRefObject)
GetObjectData(SerializationInfo, StreamingContext) //使用序列化目标对象时所需的数据填充 SerializationInfo。
GetRequestStream() //获取用于写入请求数据的 Stream 对象。
GetRequestStream(TransportContext) //获取用于写入请求数据的 Stream 对象,并输出与流关联的 TransportContext。
GetRequestStreamAsync()//当在子类中被重写时,将用于写入数据的 Stream 作为异步操作返回到 Internet 资源。(继承自 WebRequest)
GetResponse()//返回来自 Internet 资源的响应。
GetResponseAsync()//当在子代类中被重写时,将作为异步操作返回对 Internet 请求的响应。(继承自 WebRequest)
GetType()//获取当前实例的 Type。(继承自 Object)
InitializeLifetimeService()//获取生存期服务对象来控制此实例的生存期策略。(继承自 MarshalByRefObject)
MemberwiseClone()//创建当前 Object 的浅表副本。(继承自 Object)
MemberwiseClone(Boolean)//创建当前 MarshalByRefObject 对象的浅表副本。(继承自 MarshalByRefObject)
ToString()//返回表示当前对象的字符串。(继承自 Object)

Post&Get

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//POST方法
public static string HttpPost(string Url, string postDataStr)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
Encoding encoding = Encoding.UTF8;
byte[] postData = encoding.GetBytes(postDataStr);
request.ContentLength = postData.Length;
Stream myRequestStream = request.GetRequestStream();
myRequestStream.Write(postData, 0, postData.Length);
myRequestStream.Close();

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, encoding);
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
if (response != null)
response.Close();
if (request != null)
request.Abort();
return retString;
}
public static string Post(string Url, string Data, string Referer)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "POST";
request.Referer = Referer;
byte[] bytes = Encoding.UTF8.GetBytes(Data);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = bytes.Length;
Stream myResponseStream = request.GetRequestStream();
myResponseStream.Write(bytes, 0, bytes.Length);

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader myStreamReader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string retString = myStreamReader.ReadToEnd();

myStreamReader.Close();
myResponseStream.Close();

if (response != null)
response.Close();
if (request != null)
request.Abort();
return retString;
}
//GET方法
public static string HttpGet(string Url, string postDataStr)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr);
request.Proxy = null;
request.KeepAlive = false;
request.Method = "GET";
//request.ContentType = "text/html;charset=UTF-8";
request.ContentType = "application/json; charset=UTF-8";

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
//StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
string retString = myStreamReader.ReadToEnd();

myStreamReader.Close();
myResponseStream.Close();
if (response != null)
response.Close();
if (request != null)
request.Abort();
return retString;
}

HttpClient

HttpClient是.NET4.5引入的一个HTTP客户端库,其命名空间为 System.Net.Http ,.NET 4.5之前我们可能使用WebClient和HttpWebRequest来达到相同目的
HttpClient利用了最新的面向任务模式,使得处理异步请求非常容易
它适合用于多次请求操作,一般设置好默认头部后,可以进行重复多次的请求,基本上用一个实例可以提交任何的HTTP请求
HttpClient有预热机制,第一次进行访问时比较慢,所以不应该用到HttpClient就new一个出来,应该使用单例或其他方式获取HttpClient的实例

构造函数

1
2
3
HttpClient() //使用释放此实例时释放的 HttpClientHandler 初始化 HttpClient 类的新实例。
HttpClient(HttpMessageHandler) //使用指定的处理程序初始化 HttpClient 类的新实例。 处理程序在释放此实例时被释放。
HttpClient(HttpMessageHandler, Boolean) //使用提供的处理程序初始化 HttpClient 类的新实例,并指定在释放此实例时是否应释放该处理程序。

属性

1
2
3
4
5
6
BaseAddress//获取或设置用于发送请求的 Internet 资源的统一资源标识符 (URI) 的基址。
DefaultProxy//获取或设置全局 HTTP 代理。
DefaultRequestHeaders//获取应与每个请求一起发送的标头。
DefaultRequestVersion//获取或设置对此 HttpClient 实例发出的后续请求使用的默认 HTTP 版本。
MaxResponseContentBufferSize//获取或设置要在读取响应内容时缓冲的最大字节数。
Timeout//获取或设置请求超时前等待的时间跨度。

方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
CancelPendingRequests()//取消该实例上的所有挂起的请求。
DeleteAsync(String)//以异步操作将 DELETE 请求发送给指定 URI。
DeleteAsync(String, CancellationToken)//用以异步操作的取消标记发送 DELETE 请求到指定的 URI。
DeleteAsync(Uri)//以异步操作将 DELETE 请求发送给指定 URI。
DeleteAsync(Uri, CancellationToken)//用以异步操作的取消标记发送 DELETE 请求到指定的 URI。
Dispose()//释放由 HttpMessageInvoker 使用的非托管资源和托管资源。(继承自 HttpMessageInvoker)
Dispose(Boolean)//释放由 HttpClient 使用的非托管资源,并可根据需要释放托管资源。
Equals(Object)//确定指定的对象是否等于当前对象。(继承自 Object)
GetAsync(String)//以异步操作将 GET 请求发送给指定 URI。
GetAsync(String, CancellationToken)//用以异步操作的取消标记发送 GET 请求到指定的 URI。
GetAsync(String, HttpCompletionOption)//用以异步操作的 HTTP 完成选项发送 GET 请求到指定的 URI。
GetAsync(String, HttpCompletionOption, CancellationToken)//用以异步操作的 HTTP 完成选项和取消标记发送 GET 请求到指定的 URI。
GetAsync(Uri)//以异步操作将 GET 请求发送给指定 URI。
GetAsync(Uri, CancellationToken)//用以异步操作的取消标记发送 GET 请求到指定的 URI。
GetAsync(Uri, HttpCompletionOption)//用以异步操作的 HTTP 完成选项发送 GET 请求到指定的 URI。
GetAsync(Uri, HttpCompletionOption, CancellationToken)//用以异步操作的 HTTP 完成选项和取消标记发送 GET 请求到指定的 URI。
GetByteArrayAsync(String)//将 GET 请求发送到指定 URI 并在异步操作中以字节数组的形式返回响应正文。
GetByteArrayAsync(Uri)//将 GET 请求发送到指定 URI 并在异步操作中以字节数组的形式返回响应正文。
GetHashCode()//作为默认哈希函数。(继承自 Object)
GetStreamAsync(String)//将 GET 请求发送到指定 URI 并在异步操作中以流的形式返回响应正文。
GetStreamAsync(Uri)//将 GET 请求发送到指定 URI 并在异步操作中以流的形式返回响应正文。
GetStringAsync(String)//将 GET 请求发送到指定 URI 并在异步操作中以字符串的形式返回响应正文。
GetStringAsync(Uri)//将 GET 请求发送到指定 URI 并在异步操作中以字符串的形式返回响应正文。
GetType()//获取当前实例的 Type。(继承自 Object)
MemberwiseClone()//创建当前 Object 的浅表副本。(继承自 Object)
PatchAsync(String, HttpContent)//以异步操作方式将 PATCH 请求发送到指定为字符串的 URI。
PatchAsync(String, HttpContent, CancellationToken)//以异步操作方式将带有取消令牌的 PATCH 请求发送到表示为字符串的 URI。
PatchAsync(Uri, HttpContent)//以异步操作方式发送 PATCH 请求。
PatchAsync(Uri, HttpContent, CancellationToken)//以异步操作方式发送带有取消令牌的 PATCH 请求。
PostAsync(String, HttpContent)//以异步操作将 POST 请求发送给指定 URI。
PostAsync(String, HttpContent, CancellationToken)//用以异步操作的取消标记发送 POST 请求。
PostAsync(Uri, HttpContent)//以异步操作将 POST 请求发送给指定 URI。
PostAsync(Uri, HttpContent, CancellationToken)//用以异步操作的取消标记发送 POST 请求。
PutAsync(String, HttpContent)//以异步操作将 PUT 请求发送给指定 URI。
PutAsync(String, HttpContent, CancellationToken)//用以异步操作的取消标记发送 PUT 请求。
PutAsync(Uri, HttpContent)//以异步操作将 PUT 请求发送给指定 URI。
PutAsync(Uri, HttpContent, CancellationToken)//用以异步操作的取消标记发送 PUT 请求。
SendAsync(HttpRequestMessage)//以异步操作发送 HTTP 请求。
SendAsync(HttpRequestMessage, CancellationToken)//以异步操作发送 HTTP 请求。
SendAsync(HttpRequestMessage, HttpCompletionOption)//以异步操作发送 HTTP 请求。
SendAsync(HttpRequestMessage, HttpCompletionOption, CancellationToken)//以异步操作发送 HTTP 请求。
ToString()//返回表示当前对象的字符串。(继承自 Object)

单例模式(Singleton Pattern)

这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式

懒汉模式

默认不会实例化,什么时候用什么时候new

饿汉模式

类初始化时,会立即加载该对象,线程天生安全,调用效率高

双检锁/双重校验锁(DCL,即 double-checked locking)

这种方式采用双锁机制,安全且在多线程情况下能保持高性能

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
public class HttpClientHelper
{
private static readonly object LockObj = new object();
private static HttpClient client = null;
public HttpClientHelper() {
GetInstance();
}
public static HttpClient GetInstance()
{
if (client == null)
{
lock (LockObj)
{
if (client == null)
{
client = new HttpClient();
}
}
}
return client;
}
public async Task<string> PostAsync(string url, string strJson)//post异步请求方法
{
try
{
HttpContent content = new StringContent(strJson);
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
//由HttpClient发出异步Post请求
HttpResponseMessage res = await client.PostAsync(url, content);
if (res.StatusCode == System.Net.HttpStatusCode.OK)
{
string str = res.Content.ReadAsStringAsync().Result;
return str;
}
else
return null;
}
catch (Exception ex)
{
return null;
}
}

public string Post(string url, string strJson)//post同步请求方法
{
try
{
// private static HttpClient client = new HttpClient();
//client.DefaultRequestHeaders.Accept.TryParseAdd("application/json");
HttpContent content = new StringContent(strJson);
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
//client.DefaultRequestHeaders.Connection.Add("keep-alive");
//由HttpClient发出Post请求
Task<HttpResponseMessage> res = client.PostAsync(url, content);
if (res.Result.StatusCode == System.Net.HttpStatusCode.OK)
{
string str = res.Result.Content.ReadAsStringAsync().Result;
return str;
}
else
return null;
}
catch (Exception ex)
{
return null;
}
}

public string Get(string url)
{
try
{
// private static HttpClient client = new HttpClient();
//client.DefaultRequestHeaders.Accept.TryParseAdd("application/json");
var responseString = client.GetStringAsync(url);
return responseString.Result;
}
catch (Exception ex)
{
return null;
}
}

}