有什么方法可以简单地用c++发出HTTP请求吗?具体来说,我想下载一个页面(一个API)的内容,并检查内容,看看它是否包含1或0。是否也可以将内容下载到字符串中?


当前回答

如果您正在寻找在多个平台(Linux, Windows和Mac)支持的c++中的HTTP客户端库,以使用Restful web服务。您可以有以下选项。

QT网络库-允许应用程序发送网络请求并接收回复 c++ REST SDK -一个新兴的支持PPL的第三方HTTP库 Libcurl -它可能是本地世界中使用最多的http库之一。

其他回答

我也有同样的问题。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美分…

以上所有的答案都是有帮助的。我的回答只是补充了一些内容:

使用boost beast,同步示例,异步示例,ssl示例 以nghttp2为例,它支持SSL、HTTP/2 使用Facebook proxygen,这个项目包括在Facebook上使用的核心c++ HTTP抽象。它的目标是高性能和并发性。我建议用vcpkg安装它,否则你会在依赖项管理上遇到困难。支持SSL。它还支持一些高级协议:HTTP/1.1、SPDY/3、SPDY/3.1、HTTP/2和HTTP/3

nghttp2和prooxygen都是稳定的,可以考虑在生产中使用。

你可能想要检查c++ REST SDK(代号“Casablanca”)。http://msdn.microsoft.com/en-us/library/jj950081.aspx

使用c++ REST SDK,您可以更轻松地从c++应用程序连接到HTTP服务器。

使用的例子:

#include <iostream>
#include <cpprest/http_client.h>

using namespace web::http;                  // Common HTTP functionality
using namespace web::http::client;          // HTTP client features

int main(int argc, char** argv) {
    http_client client("http://httpbin.org/");

    http_response response;
    // ordinary `get` request
    response = client.request(methods::GET, "/get").get();
    std::cout << response.extract_string().get() << "\n";

    // working with json
    response = client.request(methods::GET, "/get").get();
    std::cout << "url: " << response.extract_json().get()[U("url")] << "\n";
}

c++ REST SDK是微软的一个项目,用于使用现代异步c++ API设计的本地代码进行基于云的客户端-服务器通信。

cesanta的猫鼬库似乎也支持这一点:https://github.com/cesanta/mongoose/blob/6.17/examples/http_client/http_client.c

注意,这并不需要libcurl, Windows.h,或WinSock!没有编译库,没有项目配置,等等。我有这段代码在Windows 10上的Visual Studio 2017 c++中工作:

#pragma comment(lib, "urlmon.lib")

#include <urlmon.h>
#include <sstream>

using namespace std;

...

IStream* stream;
//Also works with https URL's - unsure about the extent of SSL support though.
HRESULT result = URLOpenBlockingStream(0, "http://google.com", &stream, 0, 0);
if (result != 0)
{
    return 1;
}
char buffer[100];
unsigned long bytesRead;
stringstream ss;
stream->Read(buffer, 100, &bytesRead);
while (bytesRead > 0U)
{
    ss.write(buffer, (long long)bytesRead);
    stream->Read(buffer, 100, &bytesRead);
}
stream->Release();
string resultString = ss.str();

我只是想出了如何做到这一点,因为我想要一个简单的API访问脚本,像libcurl这样的库给我带来了各种各样的问题(即使我遵循了说明……),而WinSock只是太低级和复杂了。

我不太确定所有的IStream读取代码(特别是while条件-请随意纠正/改进),但嘿,它工作,麻烦!(这对我来说是有意义的,因为我使用了一个阻塞(同步)调用,这是很好的,bytesRead将始终是> 0U,直到流(ISequentialStream?)完成读取,但谁知道呢。)

请参见:URL名称和异步可插协议参考