使用HttpWebRequest發送模擬POST請求
這里,我在ASP.NET中使用兩個簡單的示例介紹了HttpWebRequest對像和使用HttpWebRequest對像模擬POST請求,HttpWebRequest對HTTP協議進行了完整的封裝,對HTTP協議中的Header, Content, Cookie 都做了屬性和方法的支持,很容易就能編寫出一個模擬瀏覽器自動登錄的程序。
MSDN對HttpWebRequest和HttpWebResponse的說明:
這里簡要介紹如何使用
HttpWebRequest&HttpWebResponse兩個對象與HTTP服務器進行直接交互的過程,
HttpWebRequest類對WebRequest中定義的屬性和方法提供支持,在使用HttpWebRequest對象向HTTP服務器發起請求時請不要使用HttpWebRequest對象的構造函數,而應該使用WebRequest.Create()方法來初始化新的HttpWebRequest對象。如果統一資源標識符方案是"http://"或"https://"時,Create()則返回HttpWebResponse對象。
詳細過程及代碼如下:
1、創建httpWebRequest對象,HttpWebRequest不能直接通過new來創建,只能通過WebRequest.Create(url)的方式來獲得。 WebRequest是獲得一些應用層協議對象的一個統一的入口(工廠模式),它根據參數的協議來確定最終創建的對象類型。
2、初始化HttpWebRequest對象,這個過程提供一些http請求常用的標頭屬性:agentstring,contenttype等,其中agentstring比較有意思,它是用來識別你用的瀏覽器名字的,通過設置這個屬性你可以欺騙服務器你是一個IE,firefox甚至是mac里面的safari。
很多認真設計的網站都會根據這個值來返回對不同瀏覽器特別優化的代碼。
3、附加要POST給服務器的數據到HttpWebRequest對象,附加POST數據的過程比較特殊,它並沒有提供一個屬性給用戶存取,需要寫入HttpWebRequest對象提供的一個stream里面。
4、讀取服務器的返回信息,讀取服務器返回的時候,要注意返回數據的encoding,如果我們提供的解碼類型不對,會造成亂碼,比較常見的是utf-8和gb2312。通常,網站會把它編碼的方式放在http header里面,如果沒有,我們只能通過對返回二進制值的統計方法來確定它的編碼方式。
=====================================================================
=================================
const string sUserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
const string sContentType = "application/x-www-form-urlencoded";
const string sRequestEncoding = "ascii";
const string sResponseEncoding = "utf-8";
/// <summary>
/// 1:Post data to url
/// </summary>
/// <param name="data">要post的數據</param>
/// <param name="url">目標url</param>
/// <returns>服務器響應</returns>
static string PostDataToUrl(string data, string url)
{
Encoding encoding = Encoding.GetEncoding(sRequestEncoding);
byte[] bytesToPost = encoding.GetBytes(data);
return PostDataToUrl(bytesToPost, url);
}
/// <summary>
/// Postdata to url
/// <param name="data">要post的數據</param>
/// <param name="url">目標url</param>
/// <returns>服務器響應</returns>
static string PostDataToUrl(byte[] data, string url)
//創建httpWebRequest對象
System.Net.WebRequest webRequest = System.Net.WebRequest.Create(url);
System.Net.HttpWebRequest httpRequest = webRequest as System.Net.HttpWebRequest;
if (httpRequest == null)
{
throw new ApplicationException(string.Format("Invalid url string: {0}", url));
}
httpRequest.UserAgent = sUserAgent;
httpRequest.Method = "POST";
httpRequest.ContentLength = data.Length;
Stream requestStream = httpRequest.GetRequestStream();
requestStream.Write(data, 0, data.Length);
requestStream.Close();
Stream responseStream = null;
try
{
responseStream = httpRequest.GetResponse().GetResponseStream();
}
catch (Exception e)
{
throw e;
}
//讀取服務器返回信息
string stringResponse = string.Empty;
using (StreamReader responseReader = new StreamReader(responseStream,
Encoding.GetEncoding(sResponseEncoding)))
{
stringResponse = responseReader.ReadToEnd();
}
responseStream.Close();
return stringResponse;
}
//調用
string contentHtml = PostDataToUrl("ename=simon&des=87cool", "http://www.87cool.com");
C# HttpWebRequest提交數據方式. 使用 GET 方式提交中文數據。
GET 方式通過在網絡地址中附加參數來完成數據提交,對於中文的編碼,常用的有 gb2312 和 utf8 兩種,用 gb2312
方式編碼訪問的程序代碼如下:
Encoding myEncoding = Encoding.GetEncoding("gb2312");
string address = "http://www.baidu.com/s?" + HttpUtility.UrlEncode("參數一", myEncoding) + "=" + HttpUtility.UrlEncode("值一", myEncoding);
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(address); req.Method = "GET";
using (WebResponse wr = req.GetResponse())
{
//在這里對接收到的頁面內容進行處理
}
在上面的程序代碼中,我們以 GET 方式訪問了網址 http://www.baidu.com/s,傳遞了參數“參數一=值一”,由於無法告知對方提交數據的編碼類型,所以編碼方式要以對方的網站為標准。常見的網站中, www.baidu.com(百度)的編碼方式是gb2312,www.google.com (谷歌)的編碼方式是 utf8。
C# HttpWebRequest提交數據方式4. 使用 POST 方式提交中文數據。
POST 方式通過在頁面內容中填寫參數的方法來完成數據的提交,由於提交的參數中可以說明使用的編碼方式,所以理論上能獲得更大的兼容性。用
gb2312 方式編碼訪問的程序代碼如下:
Encoding myEncoding = Encoding.GetEncoding("gb2312");
string param =
HttpUtility.UrlEncode("參數一", myEncoding) +
"=" + HttpUtility.UrlEncode("值一", myEncoding) +
"&" + HttpUtility.UrlEncode("參數二", myEncoding) +
"=" + HttpUtility.UrlEncode("值二", myEncoding);
byte[] postBytes = Encoding.ASCII.GetBytes(param);
HttpWebRequest req = (HttpWebRequest)
HttpWebRequest.Create( "http://www.baidu.com/s" );
req.Method = "POST";
req.ContentType =
"application/x-www-form-urlencoded;charset=gb2312";
req.ContentLength = postBytes.Length;
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(bs, 0, bs.Length);
}
using (WebResponse wr = req.GetResponse())
{
//在這里對接收到的頁面內容進行處理
}
//附加一個HttpWebRequest的一個小例子
/// <summary>
/// 小例子
2:直接請求,保存遠程圖片到本地
/// </summary>
static void SaveRemoteImg()
{
httpRequest.Timeout = 150000;
System.Net.HttpWebResponse resp = (System.Net.HttpWebResponse)httpRequest.GetResponse();
System.Drawing.Image img = new
System.Drawing.Bitmap(resp.GetResponseStream());
img.Save("/87cool.com.gif");
}
=====================================================================
===================