用WinINet方法实现网页的读取。第一部分是用GET方式,第二部分用POST方式。
GET方式和POST方式是向网页发送数据的两种方式,他们之间的详细差异你可以查阅RFC文档,但简单说来,你读取“http://server/cgi.dll?a=1&b=2&c=3&d=4”这一页时,你就往“http://server/cgi.dll”这个网页用GET方式发送了a=1,b=2,c=3,d=4这几个数值。
回头来说MFC中关于网络传输的几个类,CInternetSession和CHttpFile; CHttpFile是CStdioFile的子类,只要把网络上的一个文件用CHttpFile打开了,就可以象CStdioFile一样ReadString了,所以只要用CInternetSession类打开这个文件就可以了。
以下程序是中文网址自助系统在从网上查找新模板并导入的源程序。程序先用sess.OpenURL(strFileName)取得句柄,然后用fileGet->QueryInfo来查找是否存在该文件。根据HTTP协议,如果存在此文件并且一切正常,返回值就会在200-300之间。剩下的事情就是正常的文本文件的读写:
可是,GET方式来发送数据有一个限制,就是发送的数据不能太长。具体数值我没有查到,但是当strWriteName的长度大于3000字节时就会出错。为了让用户一次能传送更多的中文网址,我采取了POST的方式发送。当然, POST方式同样也有长度限制,但是比起GET更长得多。请看下一页: 用POST方式发送数据
以下程序在NT4,VISUAL C6.0上调试通过。
GET方式和POST方式是向网页发送数据的两种方式,他们之间的详细差异你可以查阅RFC文档,但简单说来,你读取“http://server/cgi.dll?a=1&b=2&c=3&d=4”这一页时,你就往“http://server/cgi.dll”这个网页用GET方式发送了a=1,b=2,c=3,d=4这几个数值。
回头来说MFC中关于网络传输的几个类,CInternetSession和CHttpFile; CHttpFile是CStdioFile的子类,只要把网络上的一个文件用CHttpFile打开了,就可以象CStdioFile一样ReadString了,所以只要用CInternetSession类打开这个文件就可以了。
以下程序是中文网址自助系统在从网上查找新模板并导入的源程序。程序先用sess.OpenURL(strFileName)取得句柄,然后用fileGet->QueryInfo来查找是否存在该文件。根据HTTP协议,如果存在此文件并且一切正常,返回值就会在200-300之间。剩下的事情就是正常的文本文件的读写:
while(fileGet->ReadString(strSentence)) fileWrite.WriteString(strSentence+"/n"); fileWrite.Close();掌握了读取网页的技术,同时也就能够用GET方式来发送数据了,例如把strWriteName改成“progsave.asp?curl=中国人&http=http://www.chinaren.com” 你就能够向松鼠之家提交你的中文网址。
可是,GET方式来发送数据有一个限制,就是发送的数据不能太长。具体数值我没有查到,但是当strWriteName的长度大于3000字节时就会出错。为了让用户一次能传送更多的中文网址,我采取了POST的方式发送。当然, POST方式同样也有长度限制,但是比起GET更长得多。请看下一页: 用POST方式发送数据
以下程序在NT4,VISUAL C6.0上调试通过。
CString strWriteName="Template01.htm" #ifndef _DEBUG strFileName="http://www.fadshop.net/curl/" + strWriteName; #else //如果是DEBUG版本就在本机的IIS上读取。 strFileName="http://mycomputer/fadshop/curl/" + strWriteName; #endif CInternetSession sess;//建立会话 CHttpFile* fileGet; CException* e; TRY { fileGet=(CHttpFile*)sess.OpenURL(strFileName);//打开文件 } CATCH_ALL(e) { fileGet = 0; } END_CATCH_ALL if(fileGet) { DWORD dwStatus; DWORD dwBuffLen = sizeof(dwStatus); BOOL bSuccess = fileGet->QueryInfo( HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &dwStatus, &dwBuffLen); if( bSuccess && dwStatus>= 200&& dwStatus<300 ) { CStdioFile fileWrite; if(fileWrite.Open(strWriteName, CFile::modeWrite|CFile::modeCreate)) { while(fileGet->ReadString(strSentence)){ fileWrite.WriteString(strSentence+"/n"); } fileWrite.Close(); SetDlgItemText(IDC_DOWNMSG, "下载完毕,正在导入..."); 导入该文件,与本话题无关 }// if openfile success. else SetDlgItemText(IDC_DOWNMSG, "本地文件"+strWriteName+"打开出错/n请检查您的硬盘是否没有空间。"); } // if bSuccess. else SetDlgItemText(IDC_DOWNMSG, "网上没有更新的中文网址模板/n请下次再执行,或者到松鼠之家查看最新信息。"); fileGet->Close(); delete fileGet; } else SetDlgItemText(IDC_DOWNMSG, "网络不通,请检查你的网络连接情况。"); sess.Close();