有什么方法可以简单地用c++发出HTTP请求吗?具体来说,我想下载一个页面(一个API)的内容,并检查内容,看看它是否包含1或0。是否也可以将内容下载到字符串中?
当前回答
我也有同样的问题。Libcurl真的很完整。如果您需要c++库,可能会对c++包装器curlpp感兴趣。neon是另一个有趣的C库,它也支持WebDAV。
如果你使用c++, curlpp看起来很自然。源代码发行版中提供了许多示例。 要获取URL的内容,你可以这样做(从示例中提取):
// Edit : rewritten for cURLpp 0.7.3
// Note : namespace changed, was cURLpp in 0.7.2 ...
#include <curlpp/cURLpp.hpp>
#include <curlpp/Options.hpp>
// RAII cleanup
curlpp::Cleanup myCleanup;
// Send request and get a result.
// Here I use a shortcut to get it in a string stream ...
std::ostringstream os;
os << curlpp::options::Url(std::string("http://example.com"));
string asAskedInQuestion = os.str();
参见curlpp源代码分发中的示例目录,有很多更复杂的情况,以及使用curlpp的简单完整的最小情况。
我的2美分…
其他回答
C和c++没有用于HTTP甚至套接字连接的标准库。多年来,一些便携式图书馆已经被开发出来。正如其他人所说,使用最广泛的是libcurl。
下面是libcurl的替代品列表(来自libcurl的网站)。
另外,对于Linux,这是一个简单的HTTP客户机。您可以实现自己的简单HTTP GET客户端,但如果涉及到身份验证或重定向,或者需要在代理后工作,则这将不起作用。对于这些情况,您需要像libcurl这样成熟的库。
对于使用libcurl的源代码,这是最接近您想要的(libcurl有许多示例)。看看主要功能。成功连接后,html内容将被复制到缓冲区。只需用自己的函数替换parseHtml即可。
HTTP协议非常简单,因此编写HTTP客户端非常简单。 这里有一个
https://github.com/pedro-vicente/lib_netsockets
它使用HTTP GET从web服务器检索文件,服务器和文件都是命令行参数。远程文件保存为本地副本。
声明:我是作者
检查http.cc https://github.com/pedro-vicente/lib_netsockets/blob/master/src/http.cc
int http_client_t::get(const char *path_remote_file)
{
char buf_request[1024];
//construct request message using class input parameters
sprintf(buf_request, "GET %s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n", path_remote_file, m_server_ip.c_str());
//send request, using built in tcp_client_t socket
if (this->write_all(buf_request, (int)strlen(buf_request)) < 0)
{
return -1;
}
编辑:编辑URL
libCURL是一个非常好的选择。根据你需要做什么,教程应该告诉你你想要什么,特别是简单的操作。但是,基本上,你可以这样做只是为了查看页面的源代码:
CURL* c;
c = curl_easy_init();
curl_easy_setopt( c, CURL_URL, "www.google.com" );
curl_easy_perform( c );
curl_easy_cleanup( c );
我相信这将导致结果被打印到标准输出。如果您想要处理它——我假设您是这样做的——您需要设置CURL_WRITEFUNCTION。上面链接的curl教程中介绍了所有这些内容。
这是我关于cURL的最小包装器,它能够以字符串的形式获取网页。例如,这对于单元测试很有用。它基本上是一个围绕C代码的RAII包装器。
在你的机器上安装libcurl libcurl-devel或等效的。
使用的例子:
CURLplusplus client;
string x = client.Get("http://google.com");
string y = client.Get("http://yahoo.com");
类的实现:
#include <curl/curl.h>
class CURLplusplus
{
private:
CURL* curl;
stringstream ss;
long http_code;
public:
CURLplusplus()
: curl(curl_easy_init())
, http_code(0)
{
}
~CURLplusplus()
{
if (curl) curl_easy_cleanup(curl);
}
std::string Get(const std::string& url)
{
CURLcode res;
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, this);
ss.str("");
http_code = 0;
res = curl_easy_perform(curl);
if (res != CURLE_OK)
{
throw std::runtime_error(curl_easy_strerror(res));
}
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
return ss.str();
}
long GetHttpCode()
{
return http_code;
}
private:
static size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp)
{
return static_cast<CURLplusplus*>(userp)->Write(buffer,size,nmemb);
}
size_t Write(void *buffer, size_t size, size_t nmemb)
{
ss.write((const char*)buffer,size*nmemb);
return size*nmemb;
}
};
2020年更新:我有一个新的答案来取代这个已经存在了8年的答案:https://stackoverflow.com/a/61177330/278976
在Linux上,我尝试了cppp -netlib、libcurl、curlpp、urdl、boost::asio,并考虑过Qt(但基于许可证拒绝了它)。所有这些都不是不完整的,有草率的界面,有糟糕的文档,没有维护或不支持https。
然后,在https://stackoverflow.com/a/1012577/278976的建议下,我尝试了POCO。哇,我真希望几年前就能看到。下面是一个使用POCO进行HTTP GET请求的示例:
https://stackoverflow.com/a/26026828/2817595
POCO是免费的、开源的(boost许可证)。不,我和这家公司没有任何关系;我真的很喜欢他们的界面。干得好,伙计们(和姑娘们)。
https://pocoproject.org/download.html
希望这能帮助到某人…我花了三天时间把所有这些库都试了一遍。