C# VC HTTP POST GET(转)
C# VC HTTP POST GET
post 提交用戶輸入的方式是隱含提交,在ASP端用request.getform()來獲取輸入域的值;
get 提交用戶輸入的方式是顯式提交,提交時在瀏覽器的地址欄里可以看見用戶輸入的內容(你在Google中輸入Java搜索,你按查找后可以在地址欄里看到java),在ASP端用request.getquery()來獲取輸入域的值;
SUMMARY
??? To properly simulate a Form submission using WinInet, you need to send a header that indicates the proper Content-Type. For Forms, the proper Content-Type header is: Content-Type: application/x-www-form-urlencoded
?摘要:
?????為了通過WinInet模擬一個表單,你需要發送一個header,來指示 Content-Type的內容。一般就是:Content-Type: application/x-www-form-urlencoded?
?????
??? MORE INFORMATION
??? In many cases, the server does not respond appropriately if a Content-Type is not specified. For example, the Active Server Pages component of IIS 3.0 actually checks this header specifically for 'application/x-www-form- urlencoded' before adding form variables to the "Request.Form" object. This MIME/Content-Type indicates that the data of the request is a list of URL- encoded form variables. URL-encoding means that space character (ASCII 32) is encoded as '+', special character such '!' encoded in hexadecemal form as '%21'.
了解更多:
????? 在許多情況下,如果Content-Type?未指定的話,服務器的返回可能就不對。比如說:IIS 3.0的ASP組件會在給"Request.Form" 對象加入變量前,檢查header?是否是 'application/x-www-form- urlencoded'?。MIME/Content-Type?表明請求的數據是一個URL- encoded的數組變量。URL-encoding?意味著空格 (ASCII 32)?被 '+'替換,特殊字符都被用相應的十六進制形式替換了,比如 '!'->'%21'。
?????
??? Here is a snippet of code that uses the MFC WinInet classes to simulate a Form POST request:
下面是一段用MFC 的WinInet?類來模擬表單提交的代碼:
???? CString strHeaders =
???? _T("Content-Type: application/x-www-form-urlencoded");
???? // URL-encoded form variables -
???? // name = "John Doe", userid = "hithere", other = "P&Q"
???? CString strFormData = _T("name=John+Doe&userid=hithere&other=P%26Q");
????
???? CInternetSession session;
???? CHttpConnection* pConnection =
???? session.GetHttpConnection(_T("ServerNameHere"));
???? CHttpFile* pFile =
???? pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST,
???? _T("FormActionHere"));
???? BOOL result = pFile->SendRequest(strHeaders,
???? (LPVOID)(LPCTSTR)strFormData, strFormData.GetLength());
????
???? 不用 MFC,用SDK實現以上的功能:
??? Without MFC, the same code translates to straight SDK calls as follows:
???? static TCHAR hdrs[] =
???? _T("Content-Type: application/x-www-form-urlencoded");
???? static TCHAR frmdata[] =
???? _T("name=John+Doe&userid=hithere&other=P%26Q");
???? statuc TCHAR accept[] =
???? _T("Accept: */*");
????
???? // for clarity, error-checking has been removed
???? HINTERNET hSession = InternetOpen("MyAgent",
???? INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
???? HINTERNET hConnect = InternetConnect(hSession, _T("ServerNameHere"),
???? INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
???? HINTERNET hRequest = HttpOpenRequest(hConnect, "POST",
???? _T("FormActionHere"), NULL, NULL, accept, 0, 1);
???? HttpSendRequest(hRequest, hdrs, strlen(hdrs), frmdata, strlen(frmdata));
???? // close any valid internet-handles
????????? 用C#實現:
????????? ?//把sXmlMessage發送到指定的DsmpUrl地址上
??????????? Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
??????????? byte[] arrB = encode.GetBytes(sXmlMessage);
??????????? HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(DsmpUrl);
??????????? myReq.Method = "POST" ;
??????????? myReq.ContentType = "application/x-www-form-urlencoded";
??????????? myReq.ContentLength = arrB.Length;
??????????? Stream outStream = myReq.GetRequestStream();???????????
??????????? outStream.Write(arrB,0,arrB.Length);
??????????? outStream.Close();
??????????? //接收HTTP做出的響應
??????????? WebResponse myResp = myReq.GetResponse();
??????????? Stream ReceiveStream = myResp.GetResponseStream();???????????????
??????????? StreamReader readStream = new StreamReader( ReceiveStream, encode );
??????????? Char[] read = new Char[256];
??????????? int count = readStream.Read( read, 0, 256 );
??????????? string str = null;
??????????? while (count > 0)
??????????? {
??????????????? str += new String(read, 0, count);
??????????????? count = readStream.Read(read, 0, 256);
??????????? }
??????????? readStream.Close();
??????????? myResp.Close();
public?? static?? string?? PostData(?? string?? str)??
? { ??
? try??
? { ??
? byte[]?? data?? =?? System.Text.Encoding.GetEncoding?? ("GB2312").GetBytes?? (?? str?? )?? ;??
? //?? 準備請求...??
? HttpWebRequest?? req?? =?? (HttpWebRequest)?? WebRequest.Create?? (?? LMMPUrl?? )?? ;????
? req.Method?? =?? "Post"?? ;??
? req.ContentType?? ="application/x-www-form-urlencoded";??
? req.ContentLength?? =?? data.Length?? ;??
? Stream?? stream?? =?? req.GetRequestStream?? ()?? ;??
? //?? 發送數據??
? stream.Write?? (?? data?? ,0?? ,data.Length?? )?? ;??
? stream.Close?? ()?? ;??
???
? HttpWebResponse?? rep?? =?? (HttpWebResponse)req.GetResponse();??
? Stream?? receiveStream?? =?? rep.GetResponseStream();??
? Encoding?? encode?? =?? System.Text.Encoding.GetEncoding("GB2312");??
? //?? Pipes?? the?? stream?? to?? a?? higher?? level?? stream?? reader?? with?? the?? required?? encoding?? format.????
? StreamReader?? readStream?? =?? new?? StreamReader(?? receiveStream,?? encode?? );??
???
? Char[]?? read?? =?? new?? Char[256];??
? int?? count?? =?? readStream.Read(?? read,?? 0,?? 256?? );??
? StringBuilder?? sb?? =?? new?? StringBuilder?? ("")?? ;??
? while?? (count?? >?? 0)????
? { ??
? String?? readstr?? =?? new?? String(read,?? 0,?? count);??
? sb.Append?? (?? readstr?? )?? ;??
? count?? =?? readStream.Read(read,?? 0,?? 256);??
? }??
???
? rep.Close();??
? readStream.Close();??
???
? return?? sb.ToString?? ()?? ;??
???
? }??
? catch(Exception?? ex)??
? { ??
? return?? ""?? ;??
? ForumExceptions.Log?? (?? ex?? )?? ;??
? }??
? }??
轉載于:https://www.cnblogs.com/guanjie20/archive/2010/01/27/1657974.html
總結
以上是生活随笔為你收集整理的C# VC HTTP POST GET(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式的一点心得
- 下一篇: 实现状态面板的显示与隐藏