用WinINet方法实现网页的读取(GET方式)

用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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 WinINet 库来实现访问 HTTP 服务器。下面是一个简单的示例代码: ```c++ #include <windows.h> #include <wininet.h> #include <iostream> #pragma comment(lib, "wininet.lib") int main() { HINTERNET hInternet = InternetOpenA("MyApp", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); if (!hInternet) { std::cerr << "InternetOpen failed: " << GetLastError() << std::endl; return 1; } HINTERNET hConnection = InternetConnectA(hInternet, "www.example.com", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); if (!hConnection) { std::cerr << "InternetConnect failed: " << GetLastError() << std::endl; InternetCloseHandle(hInternet); return 1; } HINTERNET hRequest = HttpOpenRequestA(hConnection, "GET", "/", NULL, NULL, NULL, INTERNET_FLAG_RELOAD, 0); if (!hRequest) { std::cerr << "HttpOpenRequest failed: " << GetLastError() << std::endl; InternetCloseHandle(hConnection); InternetCloseHandle(hInternet); return 1; } if (!HttpSendRequestA(hRequest, NULL, 0, NULL, 0)) { std::cerr << "HttpSendRequest failed: " << GetLastError() << std::endl; InternetCloseHandle(hRequest); InternetCloseHandle(hConnection); InternetCloseHandle(hInternet); return 1; } char buffer[1024]; DWORD bytesRead; while (InternetReadFile(hRequest, buffer, sizeof(buffer), &bytesRead) && bytesRead > 0) { std::cout << std::string(buffer, bytesRead); } InternetCloseHandle(hRequest); InternetCloseHandle(hConnection); InternetCloseHandle(hInternet); return 0; } ``` 这个示例代码使用 WinINet 库来访问 www.example.com 的根目录。首先使用 `InternetOpen` 函数打开一个句柄,然后使用 `InternetConnect` 函数连接到服务器,接着使用 `HttpOpenRequest` 函数创建一个 HTTP 请求,使用 `HttpSendRequest` 函数发送请求,最后使用 `InternetReadFile` 函数读取响应内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值