C++:url 读取器功能不适用于带有 \ 符号的 URL 链接请帮助我

问题描述

正如标题所写,这是一个返回 URL 的 HTML 源代码字符串的函数

它仅适用于主页,例如 "finance.yahoo.com/"。如果我尝试使用 Yahoo 中某个书签中的 URL,例如 "finance.yahoo.com/quote/BTC-USD/",则不起作用。

string getHtml() {

    HINTERNET hInternet = InternetopenA("InetURL/1.0",INTERNET_OPEN_TYPE_PRECONfig,NULL,0);

    HINTERNET hConnection = InternetConnectA(hInternet," finance.yahoo.com/quote/BTC-USD/",80," ",INTERNET_SERVICE_HTTP,0);

    HINTERNET hData = HttpOpenRequestA(hConnection,"GET","/",INTERNET_FLAG_KEEP_CONNECTION,0);

    char buf[2048];
    string lol;
    HttpSendRequestA(hData,0);

    DWORD bytesRead = 0;
    DWORD totalBytesRead = 0;
    int i = 0;
    string n,n2;

    while (InternetReadFile(hData,buf,2000,&bytesRead) && bytesRead != 0)
    {
        buf[bytesRead] = 0; // insert the null terminator.

        // puts(buf);          // print it to the screen.
        lol = lol + buf;
        n = lol;
        totalBytesRead += bytesRead;
    }

    InternetCloseHandle(hData);
    InternetCloseHandle(hConnection);
    InternetCloseHandle(hInternet);

    return n;
}

解决方法

这是错误的:

HINTERNET hConnection = InternetConnectA(hInternet," finance.yahoo.com/quote/BTC-USD/",80," ",INTERNET_SERVICE_HTTP,0);

HINTERNET hData = HttpOpenRequestA(hConnection,"GET","/",NULL,INTERNET_FLAG_KEEP_CONNECTION,0);

您不能“连接”到这样的 URL,只能“连接”到主机名。

您只需在 InternetConnectA() 中指定主机名,然后在 HttpOpenRequestA() 中指定与该主机名相关的所需文档。

此外,finance.yahoo.com 使用 HTTPS,而不是 HTTP,因此您需要连接到 HTTPS 端口并对请求使用安全语义。

试试这个:

HINTERNET hConnection = InternetConnectA(hInternet,"finance.yahoo.com",INTERNET_DEFAULT_HTTPS_PORT,"/quote/BTC-USD/",INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_SECURE,0);