C#模擬http 發送post或get請求


轉自: C#模擬http 發送post或get請求 

 1 private string HttpPost(string Url, string postDataStr)
 2         {
 3             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
 4             request.Method = "POST";
 5             request.ContentType = "application/x-www-form-urlencoded";
 6             request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr);
 7             request.CookieContainer = cookie;
 8             Stream myRequestStream = request.GetRequestStream();
 9             StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("gb2312"));
10             myStreamWriter.Write(postDataStr);
11             myStreamWriter.Close();
12  
13             HttpWebResponse response = (HttpWebResponse)request.GetResponse();
14  
15             response.Cookies = cookie.GetCookies(response.ResponseUri);
16             Stream myResponseStream = response.GetResponseStream();
17             StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
18             string retString = myStreamReader.ReadToEnd();
19             myStreamReader.Close();
20             myResponseStream.Close();
21  
22             return retString;
23         }
24  
25         public string HttpGet(string Url, string postDataStr)
26         {
27             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr);
28             request.Method = "GET";
29             request.ContentType = "text/html;charset=UTF-8";
30  
31             HttpWebResponse response = (HttpWebResponse)request.GetResponse();
32             Stream myResponseStream = response.GetResponseStream();
33             StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
34             string retString = myStreamReader.ReadToEnd();
35             myStreamReader.Close();
36             myResponseStream.Close();
37  
38             return retString;
39         }

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

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

 

Post另一實現:

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;
        }

 

 

 原理簡介及簡單實現:

WebRequest request = WebRequest.Create("http://www.baidu.com/");//為指定的 URI 方案初始化新的 System.Net.WebRequest 實例
        request.UseDefaultCredentials = false;//獲取或設置一個 System.Boolean 值,該值控制 System.Net.CredentialCache.DefaultCredentials
        WebResponse response = request.GetResponse();//返回對 Internet 請求的響應。
        Stream resStream = response.GetResponseStream();//返回從 Internet 資源返回數據流
        StreamReader sr = new StreamReader(resStream, System.Text.Encoding.Default);//實例華一個流的讀寫器
        ContentHtml.Text = sr.ReadToEnd();//這就是百度首頁的HTML哦 ,字符串形式的流的其余部分(從當前位置到末尾)。如果當前位置位於流的末尾,則返回空字符串 ("")
        resStream.Close();//關閉當前流並釋放與之關聯的所有資源
        sr.Close(); //關閉 System.IO.StreamReader 對象和基礎流,並釋放與讀取器關聯的所有系統資源

 

 

HttpWebRequest 和 HttpWebResponse 的應用

 
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服務器進行直接交互的過程.HttpWebRequest類對WebRequest中定義的屬性和方法提供支持,在使用HttpWebRequest對象向HTTP服務器發起請求時請不要使用HttpWebRequest對象的構造函數,而應該使用WebRequest.Create()方法來初始化新的HttpWebRequest對象.如果統一資源標識符方案是"http://"或"https://"時,Create()則返回HttpWebResponse對象.

代碼

首先,我們需要創建一個新的HttpWebRequest對象,代碼如下:

HttpWebRequest myrequest = (HttpWebRequest)WebRequest.Create(new Uri("urlstring"));

注意:上文中已經提到過不要使用HttpWebRequest的構造函數來創建對象;使用WebRequest.Create()方法初始化HttpWebRequest對象時應該對其進行類型轉換.

接下來可以對新初始化的對象進行簡單操作,比如可以設置它的標頭屬性,
下表列出了由屬性或方法設置或由系統設置的標頭:



標頭

設置方法

Accept                 由Accept屬性設置                
Connection                     由Connection屬性和KeepAlive屬性設置                    
Content-Length                         由ContentLength屬性設置                        
Content-Type                             由ContentType屬性設置                            
Expect                                 由Expect屬性設置                                
Date                                     由系統設置為當前日期                                    
Host                                         由系統設置為當前主機信息                                        
If-Modified-Since                                             由IfModifiedSince屬性設置                                            
Range                                                 由Range屬性設置                                                
Transfer-Encoding                                                     由TransferEncoding屬性設置                                                    
Referer                                                         由Referer屬性設置                                                        
User-Agent                                                            

由UserAgent屬性設置

 


注意:HttpWebRequest自動注冊.使用以"http://"或"https://"開頭的URL之前,不需要調用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
                                                

在完成對服務器的請求之后,我們需要獲取從服務器中返回的信息,正如前面提到過的,使用HttpWebResponse類,具體做法參照如下代碼:                                                

HttpWebResponse myresponse = (HttpWebResponse)myrequest.GetResponse();                                                

同樣這里我們需要使用HttpWebResponse進行類型轉換.到這里,我們已經成功的獲得服務器返回的信息,一個myresponse對象,我們可以利用它來獲得更多詳細的信息,比如從服務器返回的Headers標頭,還有其他的有用信息.而在此我們只給您列出如何獲得來自服務器響應的Headers標頭信息.我們的具體方法是這樣的:                                                

        #region GetHeaders                                                

        public static WebHeaderCollection GetHeaders(Uri uri)                                                

        {                                                

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);                                                

            // 省略部分代碼......                                                

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();                                                

            // 省略部分代碼......                                                

            return response.Headers;                                                

        }                                                

        #endregion                                                

 

下面就是提供的main()函數:                                                

        // 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]);                                                

            }                                                

        }

 

 

 

另一種實現方式:

/// <summary>
        /// Post data到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>
        /// Post data到url
        /// </summary>
        /// <param name="data">要post的數據</param>
        /// <param name="url">目標url</param>
        /// <returns>服務器響應</returns>
        static string PostDataToUrl(byte[] data, string url)
        {
            #region 創建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的內容
            httpRequest.ContentLength = data.Length;
            Stream requestStream = httpRequest.GetRequestStream();
            requestStream.Write(data, 0, data.Length);
            requestStream.Close();
            #endregion


            #region 發送post請求到服務器並讀取服務器返回信息
            Stream responseStream;
            try
            {
                responseStream = httpRequest.GetResponse().GetResponseStream();
            }
            catch (Exception e)
            {
                // log error
                Console.WriteLine(
                string.Format("POST操作發生異常:{0}", e.Message)
                );
                throw e;
            }
            #endregion

            #region 讀取服務器返回信息
            string stringResponse = string.Empty;
            using (StreamReader responseReader =
            new StreamReader(responseStream, Encoding.GetEncoding(sResponseEncoding)))
            {
                stringResponse = responseReader.ReadToEnd();
            }
            responseStream.Close();
            #endregion
            return stringResponse;
        }

調用時:

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);

 

 

還有一種實現的例子:

 

使用httpwebrequest Post數據到網站

 
怎樣通過HttpWebRequest 發送 POST 請求到一個網頁服務器?例如編寫個程序實現自動用戶登錄,自動提交表單數據到網站等。
假如某個頁面有個如下的表單(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形式提交的數據應該包含有這兩項。
其中POST的數據格式為:
表單域名稱1=值1&表單域名稱2=值2&表單域名稱3=值3……
要注意的是“值”必須是經過HTMLEncode的,即不能包含“<>=&”這些符號。

本例子要提交的數據應該是:
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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM