1、HttpWebRequest
这是.NET创建者最初开发用于使用HTTP请求的标准类。使用HttpWebRequest可以让开发者控制请求/响应流程的各个方面,如 timeouts, cookies, headers, protocols。另一个好处是HttpWebRequest类不会阻塞UI线程。例如,当您从响应很慢的API服务器下载大文件时,您的应用程序的UI不会停止响应。
如果对http协议不是了如指掌,使用HttpWebRequest会增加你的开发成本,除非你需要非常细节的处理和底层的控制,另外HttpWebRequest库已经过时,不适合业务中直接使用,他更适用于框架内部操作。
创建HttpWebRequest实例时,使用WebRequest.Create方法。如果统一资源标示符的方案是http://或https://,则Create返回HttpWebRequest对象。
GetResponse方法向RequestUri属性中指定的资源发送同步请求,并返回包含该响应的HttpWebResponse。
可以使用BeginGetResponse和EndGetResponse方法对资源发出异步请求.
当想要资源发送数据时,GetRequestStream方法返回用于发送数据的Stream对象。BeginGetRequestStream和EndGetRequestStream方法提供发送数据流的异步访问。
发送Get请求
//建立请求
HttpWebRequest request = (HttpWebRequest) WebRequest.Create("");
//发送请求获取Http响应
HttpWebResponse response = (HttpWebResponse) request.GetResponse();
//获取响应流
Stream receiveStream = response.GetResponseStream();
StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8);
Console.WriteLine(reader.ReadToEnd());
发送Post请求
public static void Main()
{
//建立请求
HttpWebRequest request=(HttpWebRequest)WebRequest.Create("");
request.Method="Post";
string inputData=Console.ReadLine();
string postData="firstnone="+inputData;
ASCIIEncoding encoding = new ASCIIEncoding ();
byte[] byte1=encoding.GetBytes(postData);
request.ContentType = "application/x-www-form-urlencoded";
Stream newStream = request.GetRequestStream ();
newStream.Write (byte1, 0, byte1.Length);
HttpWebResponse response=(HttpWebResponse)request.GetResponse();
Stream myStream = HttpResp.GetResponseStream();
StreamReader reader = new StreamReader(myStream, code);
}
2、WebClient
WebClient是一种更高级别的抽象,是HttpWebRequest为了简化最常见任务而创建的,使用过程中你会发现他缺少基本的header,timeoust的设置,不过这些可以通过继承httpwebrequest来实现。使用WebClient可能比HttpWebRequest直接使用更慢(大约几毫秒)。但这种“低效率”带来了巨大的好处:它需要更少的代码和隐藏了细节处理,更容易使用,并且在使用它时你不太可能犯错误。同样的请求示例现在很简单只需要两行而且内部周到的处理完了细节:
using (WebClient webClient = new WebClient())
{
webClient.DownloadFile("http://example.com", "路径");
}
附一个简单的Post请求代码示例:
WebClient webClient = new WebClient();
// 向服务器发送POST数据
byte[] responseArray = webClient.UploadValues(url, postValues);
string response = Encoding.UTF8.GetString(responseArray);
returns = response;
3、HttpClient
HttpClient是.NET4.5引入的一个HTTP客户端库,其命名空间为System.Net.Http。.NET 4.5之前我们可能使用WebClient和HttpWebRequest来达到相同目的。但是有几点值得关注:
可以使用单个HttpClient实例发任意数目的请求
一个HttpClient实例不会跟某个HTTP服务器或主机绑定,也就是说我们可以用一个实例同时给www.a.com和www.b.com发请求
可以继承HttpClient达到定制目的
HttpClient利用了最新的面向任务模式,使得处理异步请求非常容易.
知识点整理:
1、为了获得HttpConet对象中的数据,在本例中使用了Result属性,调用Result会阻塞该调用。还可以使用ReadAsStringAsync方法,这是一个异步调用。
2、Http的DefaultRequestHeaders属性允许设置或该变标题,使用Add属性可以给集合添加标题。设置标题后标题与标题值会与这个HttpClient实例发送的每个请求一起发送。
3、HttpClient可以把HttpMessageHandler作为其构造函数的参数,这样就可以定制请求。可以传递HttpClientHandler的实例。它有许多属性可以设置,如ClientCertificates、ContinueTimeout等。
代码实例(Post异步请求)
using (var client = new HttpClient(handler))
{
action = action.TrimEnd();
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
header = ApiHeaderCompent.AddHeader(requestUri, action, body, header,
HttpMethod.Post, appContext, context);
header?.ForEach(p => client.DefaultRequestHeaders.Add(p.Key, p.Value));
result = client.PostAsJsonAsync(requestUri + action, body).Result;
if (!result.IsSuccessStatusCode)
throw new Exception($"API POST 请求失败,请求地址: {requestUri + action}");
var data = JsonConvert.DeserializeObject<T>(result.Content.ReadAsStringAsync().Result);
return new ApiResult<T>(data);
}
Get异步请求示例
using (var client = new HttpClient(handler))
{
action = action.TrimEnd();
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
header = ApiHeaderCompent.AddHeader(requestUri, action, null, header, HttpMethod.Get, appContext, context);
header?.ForEach(p => client.DefaultRequestHeaders.Add(p.Key, p.Value));
result = client.GetAsync(requestUri + action).Result;
if (!result.IsSuccessStatusCode)
throw new Exception($"API GET 请求失败,请求地址: {requestUri + action}");
var data = JsonConvert.DeserializeObject<T>(result.Content.ReadAsStringAsync().Result);
return new ApiResult<T>(data);
}