C# 模擬瀏覽器發送post或get請求

一、基本示例 

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的時候有時也用的到cookie,像登錄163發郵件時候就需要發送cookie,所以在外部一個cookie屬性隨時保存 CookieContainer cookie = new CookieContainer();

注意:有時候請求會重定向,但我們就需要從重定向url獲取東西,像QQ登錄成功後獲取sid,但上面的會自動根據重定向地址跳轉。我們可以用:
request.AllowAutoRedirect = false;設置重定向禁用,你就可以從headers的Location屬性中獲取重定向地址。

 

二、post 調用時傳參

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;
            //注意提交的編碼 這邊是需要改變的 這邊默認的是Default:系統當前編碼
            byte[] postData = Encoding.UTF8.GetBytes(param);

            // 設置提交的相關參數 
            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;

            // 提交請求數據 
            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傳輸圖片等時的代碼示例

Post多張圖片和其他參數時,用此方法進行調用,調用方法如:

//imgDic是圖片接收名稱如media,圖片本地完整路徑或網絡完整路徑的鍵值對的集合

imgDesc是圖片信息參數及其他參數的集合,圖片信息如media1,media2,media3等,這個圖片接收名字是由接收方確定的

注意:

FileStream只能用於本地完整路徑,如C/xx.jpg等,如果是網路圖片則無法使用它。

推薦使用

WebClient wc = new WebClient();
            byte[] buffer = wc.DownloadData(filePath);
            memStream.Write(buffer, 0, buffer.Length);

這種方式,這個類無論是網路圖片還是本地圖片都可以使用,但路徑中要用/,而不是\,否則會出現不支持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("發送圖片開始-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);
            
            // 最後的結束符
            var endBoundary = Encoding.ASCII.GetBytes("--" + boundary + "--\r\n");

            // 設置屬性
            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);
            }

            // 寫入最後的結束邊界符
            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("發送圖片結束-HttpPostData -- " + responseContent, 1);
            LogStub.Log(entry);

            return responseContent;
        }

 

四、單張圖片調用

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是服務端接受圖片的參數,這個要看接收端接收圖片的參數名,注意此方法是單張圖片的post調用

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);
            // 最後的結束符
            var endBoundary = Encoding.ASCII.GetBytes("--" + boundary + "--\r\n");

            // 設置屬性
            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);
            }

            // 寫入最後的結束邊界符
            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;
        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章