平時用瀏覽器看網頁的時候,點擊一下submit按鈕的時候其實就是給服務器發送了一個POST請求。但是如何在自己的C#程序里面實現類似的功能呢?本文給出了一個簡單的范例,可以實現類似的和web server之間的POST通訊。通過程序發送POST的過程如下所示:
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之間的混淆,據我測試,國內的主機一般都是gb2312編碼的。一般設計良好的網站會把它編碼的方式放在返回的http header里面,但是也有不少網站根本沒有,我們只能通過一個對返回二進制值的統計方法來確定它的編碼方式。
/// <summary> /// /// </summary> /// <param name="url">地址</param> /// <param name="method">方法</param> /// <param name="param">json參數</param> /// <returns></returns> public static string WebServiceApp(string url, string method, string param) { //轉換輸入參數的編碼類型,獲取bytep[]數組 byte[] byteArray = Encoding.UTF8.GetBytes("json=" + param); //初始化新的webRequst //1. 創建httpWebRequest對象 HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(new Uri(url + "/" + method)); //2. 初始化HttpWebRequest對象 webRequest.Method = "POST"; webRequest.ContentType = "application/x-www-form-urlencoded"; webRequest.ContentLength = byteArray.Length; //3. 附加要POST給服務器的數據到HttpWebRequest對象(附加POST數據的過程比較特殊,它並沒有提供一個屬性給用戶存取,需要寫入HttpWebRequest對象提供的一個stream里面。) Stream newStream = webRequest.GetRequestStream();//創建一個Stream,賦值是寫入HttpWebRequest對象提供的一個stream里面 newStream.Write(byteArray, 0, byteArray.Length); newStream.Close(); //4. 讀取服務器的返回信息 HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse(); StreamReader php = new StreamReader(response.GetResponseStream(), Encoding.UTF8); string phpend = php.ReadToEnd(); return phpend; }