用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();
本文介绍用WinINet方法实现网页读取,包括GET和POST两种方式。阐述了MFC中网络传输相关类,如CInternetSession和CHttpFile的使用。还给出中文网址自助系统查找新模板并导入的源程序,分析了GET和POST方式发送数据的长度限制。
&spm=1001.2101.3001.5002&articleId=167000&d=1&t=3&u=45d4b251e02f4f61a844512ae61c28a0)
1295

被折叠的 条评论
为什么被折叠?



