|
對(duì)于如何使用 WebRequest 和 WebResponse 類在 URI 上生成 POST 請(qǐng)求,在微軟的 .Net 快速入門教程中有詳細(xì)的描述(http://chs.gotdotnet.com/quickstart/howto/doc/WebRequests/clientPOST.aspx),簡(jiǎn)要引用如下:
WebResponse 類是抽象(在 Visual Basic 中為 MustInherit)基類,協(xié)議特定的響應(yīng)類從該抽象基類派生。應(yīng)用程序可以使用 WebResponse 類的實(shí)例以協(xié)議不可知的方式參與請(qǐng)求和響應(yīng)事務(wù),而從 WebResponse 派生的協(xié)議特定的類攜帶請(qǐng)求的詳細(xì)信息。
客戶端應(yīng)用程序不直接創(chuàng)建 WebResponse 對(duì)象,而是通過調(diào)用 WebRequest 實(shí)例上的 GetResponse 方法來(lái)創(chuàng)建它。
對(duì)繼承者的說(shuō)明: 從 WebResponse 繼承時(shí),必須重寫以下成員:ContentLength、ContentType、GetResponseStream、ResponseUri 和 Headers。
如果需要使用 WebRequest 和 WebResponse 類在 URI 上生成 GET 請(qǐng)求?稍诤瘮(shù) getPage 中找到生成請(qǐng)求的特定詳細(xì)信息。getPage 函數(shù)采用字符串參數(shù),該參數(shù)是您請(qǐng)求的 Web 頁(yè)的 URL(或 URI)。然后,此 URI 作為參數(shù)包括在對(duì) WebRequest.Create 的調(diào)用中,該調(diào)用創(chuàng)建 WebRequest 對(duì)象。接著,WebRequest 對(duì)象的 GetResponse 函數(shù)用于獲取 WebResponse 對(duì)象。此對(duì)象可用于獲取響應(yīng)的狀態(tài)代碼以及實(shí)際響應(yīng)流(例如,Web 頁(yè))。可以采用幾種不同的形式寫出該流。
在處理完響應(yīng)流后,必須確保調(diào)用 WebResponse 對(duì)象的 Close 方法,以免泄露有價(jià)值的系統(tǒng)資源。
如果需要使用 WebRequest 和 WebResponse 類在 URI 上生成 POST 請(qǐng)求。 則可采用類似于帶有 GET 謂詞的簡(jiǎn)單 WebRequest。其中有兩處不同: 1) 謂詞需要更改為 POST。 2) 需要對(duì)格式信息進(jìn)行編碼并發(fā)送到流中。 若要更改謂詞,只需將 Method 屬性設(shè)置為“POST”。 然后必須將 ContentType 屬性設(shè)置為“application/x-www-form-urlencoded”。此時(shí),確保所提供的字符串編碼正確,所有內(nèi)容都將被正確地傳遞 (POST)。
處理完響應(yīng)流后,必須確保調(diào)用 WebResponse 對(duì)象的 Close 方法,以免泄露有價(jià)值的系統(tǒng)資源。
<!-- 正文 -->
了解了具體的實(shí)現(xiàn)方法及原理后,就可以實(shí)現(xiàn)其目的。首先需要一個(gè)函數(shù)以實(shí)現(xiàn)該功能: /// <summary> /// getPage 獲得 Post 請(qǐng)求結(jié)果頁(yè) /// url 要請(qǐng)求的地址 /// payload 輸入的參數(shù)<xml> /// outputResp 輸出結(jié)果 /// </summary> private bool getPage(String url, String payload, ref string outputResp) { WebResponse result = null; outputResp = ""; try { WebRequest req = WebRequest.Create(url); req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded"; if (payload != null) { string UrlEncoded = payload;
byte[] SomeBytes = null; SomeBytes = Encoding.UTF8.GetBytes(UrlEncoded.ToString()); req.ContentLength = SomeBytes.Length; Stream newStream = req.GetRequestStream(); newStream.Write(SomeBytes, 0, SomeBytes.Length); newStream.Close(); } else { req.ContentLength = 0; } result = req.GetResponse(); Stream ReceiveStream = result.GetResponseStream(); Encoding encode = System.Text.Encoding.GetEncoding("utf-8"); StreamReader sr = new StreamReader(ReceiveStream, encode); outputResp = sr.ReadToEnd(); } catch(Exception e) { Console.WriteLine( e.ToString()); Console.WriteLine("\r\n找不到請(qǐng)求 URI,或者它的格式不正確"); return false; } finally { if ( result != null ) { result.Close(); } } return true; }
這個(gè)函數(shù)就實(shí)現(xiàn)了具體的請(qǐng)求功能,要求輸入請(qǐng)求的地址(URL)及參數(shù)(payload:XML文件格式),然后 WebRequest 向服務(wù)地址發(fā)送 POST 請(qǐng)求,由 StreamReader 讀出具體的結(jié)果,下面是一個(gè)具體的使用該函數(shù)的例子:
private void Button_ServerClick(object sender, System.EventArgs e) { string UserRegisterReq = ""; UserRegisterReq = @"<?xml version=""1.0"" encoding=""GB2312""?> <ELink> <MsgType>UserRegisterReq</MsgType> <Version>1.0</Version> <UserProfile> <UserName>Test</UserName> <UserPwd>Test</UserPwd> </UserProfile> </ELink>"; string outputResp = ""; bool IsReg = false; IsReg = this.getPage(@"http://dll.test.com/test.dll/", UserRegisterReq, ref outputResp);
if(IsReg) { // outputResp = outputResp.Replace(@"<", "<"); // outputResp = outputResp.Replace(@">", ">"); Response.Write(outputResp); } }
Button_ServerClick 是一個(gè) Button 單擊事件,當(dāng)輸入正確的 URL(請(qǐng)求地址)和 payload(輸入的參數(shù)),就得到由服務(wù)程序提供
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!