场景说明
当需要调用接口、下载其它网页数据,可以使用第三方组件(例如RestSharp),但我只想简单用一下,以下主要是自行封装的示例代码。容易漏的是对C# 非托管代码的资源的释放(例如:StreamReader.Close、HttpWebRequest.Abort、Stream.Dispose),并且支持GZIP响应体解析。网络上有很多种实现,但我依然要分享我用了几年的封装,因为多数代码没有注意非托管代码的资源的释放,这样的代码运行久了容易内存泄漏。另外就是对Url的编码需要自行按参数去处理,很麻烦,干脆也封装一下。
代码如下
using System.Text;
using System.Net;
using System.IO;
using System.IO.Compression;
public class ToolX
{
/// <summary>
/// 发起Get请求,并接收响应体为字符串
/// </summary>
/// <param name="url">网址</param>
/// <param name="encode">编码格式</param>
/// <param name="dicHeader">请求头</param>
/// <returns></returns>
public string HttpGet(string url, Encoding encode = null, Dictionary<string, string> dicHeader = null)
{
string retStr = string.Empty;
encode = encode ?? Encoding.UTF8;
try
{
HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create(UrlEncode(url, encode));
hwr.Method = "GET";
hwr.ContentType = "text/html; charset=utf-8";
hwr.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36";
hwr.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
hwr.KeepAlive = false;
hwr.Headers.Add("Accept-Encoding", "gzip, deflate");
if (dicHeader != null)
{
foreach (var kv in dicHeader)
{
switch (kv.Key)
{
//部分请求头不能像这样hwr.Headers[kv.Key] = kv.Value,需要的自行写
case "ContentType": hwr.ContentType = kv.Value; break;
case "Accept": hwr.Accept = kv.Value; break;
case "UserAgent": hwr.UserAgent = kv.Value; break;
case "Referer": hwr.Referer = UrlEncode(kv.Value, encode); break;
default: hwr.Headers[kv.Key] = kv.Value; break;
}
}
}
//下载页面
HttpWebResponse httpresponse = (HttpWebResponse)hwr.GetResponse();
retStr =