C#模拟http 发送post或get请求
| 123456789101112131415161718192021222324252627282930313233343536373839 | private string HttpPost(string Url, string postDataStr)????????{????????????HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);????????????request.Method = "POST";????????????request.ContentType = "application/x-www-form-urlencoded";????????????request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr);????????????request.CookieContainer = cookie;????????????Stream myRequestStream = request.GetRequestStream();????????????StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("gb2312"));????????????myStreamWriter.Write(postDataStr);????????????myStreamWriter.Close();????????????HttpWebResponse response = (HttpWebResponse)request.GetResponse();????????????response.Cookies = cookie.GetCookies(response.ResponseUri);????????????Stream myResponseStream = response.GetResponseStream();????????????StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));????????????string retString = myStreamReader.ReadToEnd();????????????myStreamReader.Close();????????????myResponseStream.Close();????????????return retString;????????}????????public string HttpGet(string Url, string postDataStr)????????{????????????HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr);????????????request.Method = "GET";????????????request.ContentType = "text/html;charset=UTF-8";????????????HttpWebResponse response = (HttpWebResponse)request.GetResponse();????????????Stream myResponseStream = response.GetResponseStream();????????????StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));????????????string retString = myStreamReader.ReadToEnd();????????????myStreamReader.Close();????????????myResponseStream.Close();????????????return retString;????????} |
在post的時(shí)候有時(shí)也用的到cookie,像登錄163發(fā)郵件時(shí)候就需要發(fā)送cookie,所以在外部一個cookie屬性隨時(shí)保存 CookieContainer cookie = new CookieContainer();
!注意:有時(shí)候請求會重定向,但我們就需要從重定向url獲取東西,像QQ登錄成功后獲取sid,但上面的會自動根據(jù)重定向地址跳轉(zhuǎn)。我們可以用:
request.AllowAutoRedirect = false;設(shè)置重定向禁用,你就可以從headers的Location屬性中獲取重定向地址
?
Post另一實(shí)現(xiàn):
post 調(diào)用時(shí)傳參,如:
string url = "http://www.baidu.com/";
??????????? string result = string.Empty;
??????????? string param = string.Format("WechatOpenID={0}&Content={1}", webchatOpenID, content);
??????????? result = HttpPostData(url, param);
?
?
public string HttpPostData(string url, string param)
??????? {
??????????? var result = string.Empty;
??????????? //注意提交的編碼 這邊是需要改變的 這邊默認(rèn)的是Default:系統(tǒng)當(dāng)前編碼
??????????? byte[] postData = Encoding.UTF8.GetBytes(param);
??????????? // 設(shè)置提交的相關(guān)參數(shù)
??????????? HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
??????????? Encoding myEncoding = Encoding.UTF8;
??????????? request.Method = "POST";
??????????? request.KeepAlive = false;
??????????? request.AllowAutoRedirect = true;
??????????? request.ContentType = "application/x-www-form-urlencoded";
??????????? request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR? 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";
??????????? request.ContentLength = postData.Length;
??????????? // 提交請求數(shù)據(jù)
??????????? System.IO.Stream outputStream = request.GetRequestStream();
??????????? outputStream.Write(postData, 0, postData.Length);
??????????? outputStream.Close();
??????????? HttpWebResponse response;
??????????? Stream responseStream;
??????????? StreamReader reader;
??????????? string srcString;
??????????? response = request.GetResponse() as HttpWebResponse;
??????????? responseStream = response.GetResponseStream();
??????????? reader = new System.IO.StreamReader(responseStream, Encoding.GetEncoding("UTF-8"));
??????????? srcString = reader.ReadToEnd();
??????????? result = srcString;?? //返回值賦值
??????????? reader.Close();
??????????? return result;
??????? }
?
Post傳輸圖片等時(shí)的代碼示例:
Post多張圖片和其他參數(shù)時(shí),用此方法進(jìn)行調(diào)用,調(diào)用方法如:
//imgDic是圖片接收名稱如media,圖片本地完整路徑或網(wǎng)絡(luò)完整路徑的鍵值對的集合
imgDesc是圖片信息參數(shù)及其他參數(shù)的集合,圖片信息如media1,media2,media3等,這個圖片接收名字是由接收方確定的
注意:
FileStream只能用于本地完整路徑,如C/xx.jpg等,如果是網(wǎng)路圖片則無法使用它。
推薦使用
WebClient wc = new WebClient();
??????????? byte[] buffer = wc.DownloadData(filePath);
??????????? memStream.Write(buffer, 0, buffer.Length);
這種方式,這個類無論是網(wǎng)路圖片還是本地圖片都可以使用,但路徑中要用/,而不是\,否則會出現(xiàn)不支持URI的錯誤。
if (openIDList != null && openIDList.Any() && imgDesc != null)
??????????? {
??????????????? Dictionary<string, string> imgDic = new Dictionary<string, string>();
??????????????? foreach (var item in imgDesc)
??????????????? {
??????????????????? imgDic.Add(item.name, item.path);
??????????????? }
??????????????? NameValueCollection col = new NameValueCollection();
??????????????? col.Add("imgDesc", Newtonsoft.Json.JsonConvert.SerializeObject(imgDesc));
??????????????? col.Add("open_ids", string.Join(",", openIDList));
??????????????? result = HttpPostData(url, 60000, imgDic, col);
??????????? }
?
private static string HttpPostData(string url, int timeOut, Dictionary<string, string> imgDic, NameValueCollection stringDict)
??????? {
??????????? LogEntry entry = new LogEntry("發(fā)送圖片開始-HttpPostData -- " + stringDict["open_ids"], 1);
??????????? LogStub.Log(entry);
??????????? var firstImg = imgDic.FirstOrDefault();
??????????? string fileKeyName = firstImg.Key;
??????????? string filePath = firstImg.Value;
??????????? string responseContent;
??????????? var memStream = new MemoryStream();
??????????? var webRequest = (HttpWebRequest)WebRequest.Create(url);
??????????? // 邊界符
??????????? var boundary = "---------------" + DateTime.Now.Ticks.ToString("x");
??????????? // 邊界符
??????????? var beginBoundary = Encoding.ASCII.GetBytes("--" + boundary + "\r\n");
??????????? //var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
???????????
??????????? // 最后的結(jié)束符
??????????? var endBoundary = Encoding.ASCII.GetBytes("--" + boundary + "--\r\n");
??????????? // 設(shè)置屬性
??????????? webRequest.Method = "POST";
??????????? webRequest.Timeout = timeOut;
??????????? webRequest.ContentType = "multipart/form-data; boundary=" + boundary;
??????????? // 寫入文件
??????????? const string filePartHeader =
??????????????? "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" +
???????????????? "Content-Type: application/octet-stream\r\n\r\n";
??????????? var header = string.Format(filePartHeader, fileKeyName, filePath);
??????????? var headerbytes = Encoding.UTF8.GetBytes(header);
??????????? memStream.Write(beginBoundary, 0, beginBoundary.Length);
??????????? memStream.Write(headerbytes, 0, headerbytes.Length);
??????????? //var buffer = new byte[1024];
??????????? //int bytesRead; // =0
??????????? //while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
??????????? //{
??????????? //??? memStream.Write(buffer, 0, bytesRead);
??????????? //}
??????????? WebClient wc = new WebClient();
??????????? byte[] buffer = wc.DownloadData(filePath);
??????????? memStream.Write(buffer, 0, buffer.Length);
??????????? //第二章圖片
??????????? //memStream.Write(beginBoundary, 0, beginBoundary.Length);
??????????? //var aaa = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
??????????? //memStream.Write(aaa, 0, aaa.Length);
??????????? string imgName = string.Empty;
??????????? string imgPath = string.Empty;
??????????? foreach (var img in imgDic.Where(p => p.Key != fileKeyName))
??????????? {
??????????????? imgName = img.Key;
??????????????? imgPath = img.Value;
??????????????? string nxetFileFormat = "\r\n--" + boundary + "\r\n" + filePartHeader;
??????????????? header = string.Format(nxetFileFormat, imgName, imgPath);
??????????????? headerbytes = Encoding.UTF8.GetBytes(header);
??????????????? memStream.Write(headerbytes, 0, headerbytes.Length);
??????????????? //fileStream = new FileStream(imgPath, FileMode.Open, FileAccess.Read);
??????????????? //while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
??????????????? //{
??????????????? //??? memStream.Write(buffer, 0, bytesRead);
??????????????? //}
??????????????? buffer = wc.DownloadData(imgPath);
??????????????? memStream.Write(buffer, 0, buffer.Length);
??????????? }
??????????? // 寫入字符串的Key
??????????? var stringKeyHeader = "\r\n--" + boundary +
?????????????????????????????????? "\r\nContent-Disposition: form-data; name=\"{0}\"" +
?????????????????????????????????? "\r\n\r\n{1}\r\n";
??????????? foreach (byte[] formitembytes in from string key in stringDict.Keys
???????????????????????????????????????????? select string.Format(stringKeyHeader, key, stringDict[key])
???????????????????????????????????????????????? into formitem
???????????????????????????????????????????????? select Encoding.UTF8.GetBytes(formitem))
??????????? {
??????????????? memStream.Write(formitembytes, 0, formitembytes.Length);
??????????? }
??????????? // 寫入最后的結(jié)束邊界符
??????????? memStream.Write(endBoundary, 0, endBoundary.Length);
??????????? webRequest.ContentLength = memStream.Length;
??????????? var requestStream = webRequest.GetRequestStream();
??????????? memStream.Position = 0;
??????????? var tempBuffer = new byte[memStream.Length];
??????????? memStream.Read(tempBuffer, 0, tempBuffer.Length);
??????????? memStream.Close();
??????????? requestStream.Write(tempBuffer, 0, tempBuffer.Length);
??????????? requestStream.Close();
??????????? var httpWebResponse = (HttpWebResponse)webRequest.GetResponse();
??????????? using (var httpStreamReader = new StreamReader(httpWebResponse.GetResponseStream(),
??????????????????????????????????????????????????????????? Encoding.GetEncoding("utf-8")))
??????????? {
??????????????? responseContent = httpStreamReader.ReadToEnd();
??????????? }
??????????? fileStream.Close();
??????????? httpWebResponse.Close();
??????????? webRequest.Abort();
??????????? entry = new LogEntry("發(fā)送圖片結(jié)束-HttpPostData -- " + responseContent, 1);
??????????? LogStub.Log(entry);
??????????? return responseContent;
??????? }
?
?
?
?
單行圖片調(diào)用以下方法時(shí),如:
NameValueCollection col = new NameValueCollection();
??????????????? //col.Add("media", filePath);
??????????????? col.Add("title", title);
??????????????? col.Add("content", content);
??????????????? col.Add("open_ids", string.Join(",", openIDList));
??????????????? result = HttpPostData(url, 60000, "media", filePath, col);
filePath是客戶端的圖片完整路徑,
media是服務(wù)端接受圖片的參數(shù),這個要看接收端接收圖片的參數(shù)名,注意此方法是單張圖片的post調(diào)用
private static string HttpPostData(string url, int timeOut, string fileKeyName,
??????????????????????????????????? string filePath, NameValueCollection stringDict)
??????? {
??????????? string responseContent;
??????????? var memStream = new MemoryStream();
??????????? var webRequest = (HttpWebRequest)WebRequest.Create(url);
??????????? // 邊界符
??????????? var boundary = "---------------" + DateTime.Now.Ticks.ToString("x");
??????????? // 邊界符
??????????? var beginBoundary = Encoding.ASCII.GetBytes("--" + boundary + "\r\n");
??????????? var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
??????????? // 最后的結(jié)束符
??????????? var endBoundary = Encoding.ASCII.GetBytes("--" + boundary + "--\r\n");
??????????? // 設(shè)置屬性
??????????? webRequest.Method = "POST";
??????????? webRequest.Timeout = timeOut;
??????????? webRequest.ContentType = "multipart/form-data; boundary=" + boundary;
??????????? // 寫入文件
??????????? const string filePartHeader =
??????????????? "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" +
???????????????? "Content-Type: application/octet-stream\r\n\r\n";
??????????? var header = string.Format(filePartHeader, fileKeyName, filePath);
??????????? var headerbytes = Encoding.UTF8.GetBytes(header);
??????????? memStream.Write(beginBoundary, 0, beginBoundary.Length);
??????????? memStream.Write(headerbytes, 0, headerbytes.Length);
??????????? var buffer = new byte[1024];
??????????? int bytesRead; // =0
??????????? while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
??????????? {
??????????????? memStream.Write(buffer, 0, bytesRead);
??????????? }
??????????? // 寫入字符串的Key
??????????? var stringKeyHeader = "\r\n--" + boundary +
?????????????????????????????????? "\r\nContent-Disposition: form-data; name=\"{0}\"" +
?????????????????????????????????? "\r\n\r\n{1}\r\n";
??????????? foreach (byte[] formitembytes in from string key in stringDict.Keys
???????????????????????????????????????????? select string.Format(stringKeyHeader, key, stringDict[key])
???????????????????????????????????????????????? into formitem
???????????????????????????????????????????????? select Encoding.UTF8.GetBytes(formitem))
??????????? {
??????????????? memStream.Write(formitembytes, 0, formitembytes.Length);
??????????? }
??????????? // 寫入最后的結(jié)束邊界符
??????????? memStream.Write(endBoundary, 0, endBoundary.Length);
??????????? webRequest.ContentLength = memStream.Length;
??????????? var requestStream = webRequest.GetRequestStream();
??????????? memStream.Position = 0;
??????????? var tempBuffer = new byte[memStream.Length];
??????????? memStream.Read(tempBuffer, 0, tempBuffer.Length);
??????????? memStream.Close();
??????????? requestStream.Write(tempBuffer, 0, tempBuffer.Length);
??????????? requestStream.Close();
??????????? var httpWebResponse = (HttpWebResponse)webRequest.GetResponse();
??????????? using (var httpStreamReader = new StreamReader(httpWebResponse.GetResponseStream(),
??????????????????????????????????????????????????????????? Encoding.GetEncoding("utf-8")))
??????????? {
??????????????? responseContent = httpStreamReader.ReadToEnd();
??????????? }
??????????? fileStream.Close();
??????????? httpWebResponse.Close();
??????????? webRequest.Abort();
??????????? return responseContent;
??????? }
?
?
?原理簡介及簡單實(shí)現(xiàn):
WebRequest request = WebRequest.Create("http://www.baidu.com/");//為指定的 URI 方案初始化新的 System.Net.WebRequest 實(shí)例
??????? request.UseDefaultCredentials = false;//獲取或設(shè)置一個 System.Boolean 值,該值控制 System.Net.CredentialCache.DefaultCredentials
??????? WebResponse response = request.GetResponse();//返回對 Internet 請求的響應(yīng)。
??????? Stream resStream = response.GetResponseStream();//返回從 Internet 資源返回?cái)?shù)據(jù)流
??????? StreamReader sr = new StreamReader(resStream, System.Text.Encoding.Default);//實(shí)例華一個流的讀寫器
??????? ContentHtml.Text = sr.ReadToEnd();//這就是百度首頁的HTML哦 ,字符串形式的流的其余部分(從當(dāng)前位置到末尾)。如果當(dāng)前位置位于流的末尾,則返回空字符串 ("")
??????? resStream.Close();//關(guān)閉當(dāng)前流并釋放與之關(guān)聯(lián)的所有資源
??????? sr.Close(); //關(guān)閉 System.IO.StreamReader 對象和基礎(chǔ)流,并釋放與讀取器關(guān)聯(lián)的所有系統(tǒng)資源
?
?
HttpWebRequest 和 HttpWebResponse 的應(yīng)用
HttpWebRequest?request?=?(HttpWebRequest)WebRequest.Create(addr);//?Downloads?the?XML?file?from?the?specified?server.
HttpWebResponse?response?=?(HttpWebResponse)request.GetResponse();
System.IO.StreamReader?sr?=?new?StreamReader(response.GetResponseStream(),?System.Text.Encoding.GetEncoding("gb2312"));
Console.Write(sr.ReadToEnd());
sr.Close();
response.Close();
1.獲取http地址上的圖片
http://www.cnblogs.com/fooo/archive/2007/06/28/798335.html
HttpWebResponse?resp;
????????HttpWebRequest?req?=?(HttpWebRequest)HttpWebRequest.Create("http://www.csdn.net/Images/logo_csdn.gif");
????????req.Timeout?=?150000;
????????resp?=?(HttpWebResponse)req.GetResponse();
????????System.Drawing.Image?img;
????????img?=?new?System.Drawing.Bitmap(resp.GetResponseStream());
2.
HttpWebRequest&HttpWebResponse Headers
介紹
這里簡要介紹如何使用HttpWebRequest&HttpWebResponse兩個對象與HTTP服務(wù)器進(jìn)行直接交互的過程.HttpWebRequest類對WebRequest中定義的屬性和方法提供支持,在使用HttpWebRequest對象向HTTP服務(wù)器發(fā)起請求時(shí)請不要使用HttpWebRequest對象的構(gòu)造函數(shù),而應(yīng)該使用WebRequest.Create()方法來初始化新的HttpWebRequest對象.如果統(tǒng)一資源標(biāo)識符方案是"http://"或"https://"時(shí),Create()則返回HttpWebResponse對象.
代碼
首先,我們需要創(chuàng)建一個新的HttpWebRequest對象,代碼如下:
HttpWebRequest myrequest = (HttpWebRequest)WebRequest.Create(new Uri("urlstring"));
注意:上文中已經(jīng)提到過不要使用HttpWebRequest的構(gòu)造函數(shù)來創(chuàng)建對象;使用WebRequest.Create()方法初始化HttpWebRequest對象時(shí)應(yīng)該對其進(jìn)行類型轉(zhuǎn)換.
接下來可以對新初始化的對象進(jìn)行簡單操作,比如可以設(shè)置它的標(biāo)頭屬性,
下表列出了由屬性或方法設(shè)置或由系統(tǒng)設(shè)置的標(biāo)頭:
標(biāo)頭 | 設(shè)置方法 |
| Accept???????????????? | 由Accept屬性設(shè)置???????????????? |
| Connection???????????????????? | 由Connection屬性和KeepAlive屬性設(shè)置???????????????????? |
| Content-Length???????????????????????? | 由ContentLength屬性設(shè)置???????????????????????? |
| Content-Type???????????????????????????? | 由ContentType屬性設(shè)置???????????????????????????? |
| Expect???????????????????????????????? | 由Expect屬性設(shè)置???????????????????????????????? |
| Date???????????????????????????????????? | 由系統(tǒng)設(shè)置為當(dāng)前日期???????????????????????????????????? |
| Host???????????????????????????????????????? | 由系統(tǒng)設(shè)置為當(dāng)前主機(jī)信息???????????????????????????????????????? |
| If-Modified-Since???????????????????????????????????????????? | 由IfModifiedSince屬性設(shè)置???????????????????????????????????????????? |
| Range???????????????????????????????????????????????? | 由Range屬性設(shè)置???????????????????????????????????????????????? |
| Transfer-Encoding???????????????????????????????????????????????????? | 由TransferEncoding屬性設(shè)置???????????????????????????????????????????????????? |
| Referer???????????????????????????????????????????????????????? | 由Referer屬性設(shè)置???????????????????????????????????????????????????????? |
| User-Agent???????????????????????????????????????????????????????????? | 由UserAgent屬性設(shè)置 |
注意:HttpWebRequest自動注冊.使用以"http://"或"https://"開頭的URL之前,不需要調(diào)用RegisterPrefix方法來注冊????????????????????????????????????????????????
System.Net.HttpWebRequest選自:
MSDN:ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref10/html/T_System_Net_HttpWebRequest.htm????????????????????????????????????????????????
在完成對服務(wù)器的請求之后,我們需要獲取從服務(wù)器中返回的信息,正如前面提到過的,使用HttpWebResponse類,具體做法參照如下代碼:????????????????????????????????????????????????
HttpWebResponse myresponse = (HttpWebResponse)myrequest.GetResponse();????????????????????????????????????????????????
同樣這里我們需要使用HttpWebResponse進(jìn)行類型轉(zhuǎn)換.到這里,我們已經(jīng)成功的獲得服務(wù)器返回的信息,一個myresponse對象,我們可以利用它來獲得更多詳細(xì)的信息,比如從服務(wù)器返回的Headers標(biāo)頭,還有其他的有用信息.而在此我們只給您列出如何獲得來自服務(wù)器響應(yīng)的Headers標(biāo)頭信息.我們的具體方法是這樣的:????????????????????????????????????????????????
??????? #region GetHeaders????????????????????????????????????????????????
??????? public static WebHeaderCollection GetHeaders(Uri uri)????????????????????????????????????????????????
??????? {????????????????????????????????????????????????
??????????? HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);????????????????????????????????????????????????
??????????? // 省略部分代碼......????????????????????????????????????????????????
??????????? HttpWebResponse response = (HttpWebResponse)request.GetResponse();????????????????????????????????????????????????
??????????? // 省略部分代碼......????????????????????????????????????????????????
??????????? return response.Headers;????????????????????????????????????????????????
??????? }????????????????????????????????????????????????
??????? #endregion????????????????????????????????????????????????
下面就是提供的main()函數(shù):????????????????????????????????????????????????
??????? // The app entry point????????????????????????????????????????????????
??????? public static void Main(string[] args)????????????????????????????????????????????????
??????? {????????????????????????????????????????????????
??????????? WebHeaderCollection headers = GetHeaders(new Uri("http://www.listim.net"));????????????????????????????????????????????????
??????????? string[] headkeys = headers.AllKeys;????????????????????????????????????????????????
??????????? Console.WriteLine("{0,-30}{1}", "Name", "Value");????????????????????????????????????????????????
??????????? Console.WriteLine("--------------------------------");????????????????????????????????????????????????
??????????? foreach (string s in headkeys)????????????????????????????????????????????????
??????????? {????????????????????????????????????????????????
??????????????? Console.WriteLine("{0,-30}{1}", s, headers[s]);????????????????????????????????????????????????
??????????? }????????????????????????????????????????????????
??????? }
?
?
?
另一種實(shí)現(xiàn)方式:
/// <summary>
??????? /// Post data到url
??????? /// </summary>
??????? /// <param name="data">要post的數(shù)據(jù)</param>
??????? /// <param name="url">目標(biāo)url</param>
??????? /// <returns>服務(wù)器響應(yīng)</returns>
??????? static string PostDataToUrl(string data, string url)
??????? {
??????????? Encoding encoding = Encoding.GetEncoding(sRequestEncoding);
??????????? byte[] bytesToPost = encoding.GetBytes(data);
??????????? return PostDataToUrl(bytesToPost, url);
??????? }
??????? /// <summary>
??????? /// Post data到url
??????? /// </summary>
??????? /// <param name="data">要post的數(shù)據(jù)</param>
??????? /// <param name="url">目標(biāo)url</param>
??????? /// <returns>服務(wù)器響應(yīng)</returns>
??????? static string PostDataToUrl(byte[] data, string url)
??????? {
??????????? #region 創(chuàng)建httpWebRequest對象
??????????? WebRequest webRequest = WebRequest.Create(url);
??????????? HttpWebRequest httpRequest = webRequest as HttpWebRequest;
??????????? if (httpRequest == null)
??????????? {
??????????????? throw new ApplicationException(
??????????????? string.Format("Invalid url string: {0}", url)
??????????????? );
??????????? }
??????????? #endregion
??????????? #region 填充httpWebRequest的基本信息
??????????? httpRequest.UserAgent = sUserAgent;
??????????? httpRequest.ContentType = sContentType;
??????????? httpRequest.Method = "POST";
??????????? #endregion
??????????? #region 填充要post的內(nèi)容
??????????? httpRequest.ContentLength = data.Length;
??????????? Stream requestStream = httpRequest.GetRequestStream();
??????????? requestStream.Write(data, 0, data.Length);
??????????? requestStream.Close();
??????????? #endregion
??????????? #region 發(fā)送post請求到服務(wù)器并讀取服務(wù)器返回信息
??????????? Stream responseStream;
??????????? try
??????????? {
??????????????? responseStream = httpRequest.GetResponse().GetResponseStream();
??????????? }
??????????? catch (Exception e)
??????????? {
??????????????? // log error
??????????????? Console.WriteLine(
??????????????? string.Format("POST操作發(fā)生異常:{0}", e.Message)
??????????????? );
??????????????? throw e;
??????????? }
??????????? #endregion
??????????? #region 讀取服務(wù)器返回信息
??????????? string stringResponse = string.Empty;
??????????? using (StreamReader responseReader =
??????????? new StreamReader(responseStream, Encoding.GetEncoding(sResponseEncoding)))
??????????? {
??????????????? stringResponse = responseReader.ReadToEnd();
??????????? }
??????????? responseStream.Close();
??????????? #endregion
??????????? return stringResponse;
??????? }
調(diào)用時(shí):
string param = string.Format("time={0}&oid={1}&order={2}&name={3}&area={4}&point={5}&amount={6}&return={7}&hash={8}&version={9}", Time, Oid, OrderID, LoginName, Area, Point, Amount, ReturnUrl, HashMoli, Version);
string result = PostDataToUrl(param, PostUrl);
?
?
還有一種實(shí)現(xiàn)的例子:
?
使用httpwebrequest Post數(shù)據(jù)到網(wǎng)站
怎樣通過HttpWebRequest 發(fā)送 POST 請求到一個網(wǎng)頁服務(wù)器?例如編寫個程序?qū)崿F(xiàn)自動用戶登錄,自動提交表單數(shù)據(jù)到網(wǎng)站等。假如某個頁面有個如下的表單(Form):
<form name="form1" action="http://www.here.com/login.asp" method="post">
??<input type="text" name="userid" value="">
??<input type="password" name="password" value="">
< /form>
????
從表單可看到表單有兩個表單域,一個是userid另一個是password,所以以POST形式提交的數(shù)據(jù)應(yīng)該包含有這兩項(xiàng)。
其中POST的數(shù)據(jù)格式為:
表單域名稱1=值1&表單域名稱2=值2&表單域名稱3=值3……
要注意的是“值”必須是經(jīng)過HTMLEncode的,即不能包含“<>=&”這些符號。
本例子要提交的數(shù)據(jù)應(yīng)該是:
userid=value1&password=value2
用C#寫提交程序:
??string strId = "guest";
??string strPassword= "123456";
??ASCIIEncoding encoding=new ASCIIEncoding();
??string postData="userid="+strId;
??postData += ("&password="+strPassword);
??byte[] data = encoding.GetBytes(postData);
??// Prepare web request...
??HttpWebRequest myRequest =
?? (HttpWebRequest)WebRequest.Create("http://www.here.com/login.asp");
??myRequest.Method = "POST";
??myRequest.ContentType="application/x-www-form-urlencoded";
??myRequest.ContentLength = data.Length;
??Stream newStream=myRequest.GetRequestStream();
??// Send the data.
??newStream.Write(data,0,data.Length);
??newStream.Close();
??// Get response
??HttpWebResponse myResponse=(HttpWebResponse)myRequest.GetResponse();
??StreamReader reader = new StreamReader(response.GetResponseStream(),Encoding.Default);
??string content = reader.ReadToEnd();
??Console.WriteLine(content);
?
?
總結(jié)
以上是生活随笔為你收集整理的C#模拟http 发送post或get请求的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript操作html元素CS
- 下一篇: windows server中 森林、域