中文网址自助系统的部分源程序


       用VC读取网页、GET方式发送数据



下一页:POST方式发送数据

中文网址自助系统提供用户一个用中文访问互联网的选择。用户可以自己定义 自己喜欢的中文网站名字。详见http://www.fadshop.net/curl。 还可参看《中文域名的现状》

这里介绍用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之间。剩下的事情就是正常的文本文件的读写:
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();

Copyright 1998-2002 Fadshop.net, Inc. All rights reserved. jhj123@163.net