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

Posted

技术标签:

【中文标题】C++:url 阅读器功能不适用于带有 \\ 符号的 URL 链接。请帮助我【英文标题】:C++ : the url reader function doesn't work for URL links with \ sign. pls help meC++:url 阅读器功能不适用于带有 \ 符号的 URL 链接。请帮助我 【发布时间】:2021-06-03 17:30:16 【问题描述】:

正如标题所写,这是一个返回 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, NULL, 0);

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

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

    char buf[2048];
    string lol;
    HttpSendRequestA(hData, NULL, 0, NULL, 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;

【问题讨论】:

"...这行不通..." - 有没有返回任何东西,如果有的话? 除了完全没有错误处理(为什么?)之外,我真的看不出这段代码有什么问题。但它正在请求coinbase.com 的“主页”,你说它工作正常。您能否提供一个更好的无法正常工作的 URL 示例?您是否考虑了 finance.yahoo.com 在 HTTPS 而不是 HTTP 上运行的事实,因此端口是 443 而不是 80,并且需要 INTERNET_FLAG_SECURE 标志?其实coinbase.com也一样 亲爱的 Richard Critten:@RichardCritten 不,函数没有到达 URL。获取 html 源代码的字符串为 NULL。 @RemyLebeau 亲爱的朋友,你是对的,在 coinbase 的主页上该功能有效。这是一个不起作用的示例:(我有字符限制,所以我添加了前几行。程序的其余部分与上面相同) string getHtml() HINTERNET hInternet = InternetOpenA("InetURL/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); HINTERNET hConnection = InternetConnectA(hInternet, "finance.yahoo.com/quote/BTC-USD/", 80, " ", " ", INTERNET_SERVICE_HTTP, 0, 0); 您应该编辑您的问题以包含不起作用的代码。 【参考方案1】:

这是错误的:

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

HINTERNET hData = HttpOpenRequestA(hConnection, "GET", "/", NULL, NULL, 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, " ", " ", INTERNET_SERVICE_HTTP, 0, 0);

HINTERNET hData = HttpOpenRequestA(hConnection, "GET", "/quote/BTC-USD/", NULL, NULL, NULL, INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_SECURE, 0);

【讨论】:

以上是关于C++:url 阅读器功能不适用于带有 \ 符号的 URL 链接。请帮助我的主要内容,如果未能解决你的问题,请参考以下文章

IPC_RMID 不适用于带有 C++ 的 linux

带有 Swift 3 的 Alamofire 4.3,POST 请求不适用于 URL 参数

带有忽略大小写的 JDBC URL 不适用于 H2 数据库连接

ul 填充不适用于浮动 img 旁边

带有 Excel 的 Datatables TableTools,pdf 导出功能不适用于 firefox,但只能在 Chrome 中使用

Typeahead Bloodhound 提示和自动完成功能不适用于远程 URL