我应该使用哪个C++库来实现HTTP客户端?

50

我正在寻找一个实现或能够实现HTTP客户端的C++库,它应该也能处理cookies。

您有什么建议吗?


duplicate: https://dev59.com/XUXRa4cB1Zd3GeqPv-8H - lothar
9
我个人认为不是这个问题(异步库、线程),这是另一个问题。 - dfa
请查看这个不错的列表:https://en.cppreference.com/w/cpp/links/libs - Vraj Pandya
简单的HTTP客户端 https://github.com/pedro-vicente/lib_netsockets/blob/master/examples/http_client.cc - Pedro Vicente
Boost.Beast - madhur4127
8个回答

40

Curl++是一个选择,尤其是如果你希望以更符合C ++风格的方式进行操作。

cpp-netlib非常好用且简单,可在ubuntu上使用。

sudo apt-get install libcppnetlib-dev

例子:

using namespace boost::network;
using namespace boost::network::http;

client::request request_("http://127.0.0.1:8000/");
request_ << header("Connection", "close");
client client_;
client::response response_ = client_.get(request_);
std::string body_ = body(response_);

2
结尾下划线编码规范表示什么意思? - rbanffy
1
@rbanffy 有时用于私有成员,但更常用于避免名称冲突(特别是与关键字冲突)。 - Xeverous
2
在Ubuntu 18.04上无法找到libcppnetlib-dev软件包。 - PC.

18

请看一下 Poco Libraries

我开始使用它们是因为它们是可移植的,而且很容易使用。简单、清晰 - 尽管我目前还没有深入研究任何复杂的内容。


4
Poco是一个非常好的库,我认为它应该获得更多的关注。 - jcoder
1
自从C++11发布以来,Poco似乎已经过时了,它有自己的非标准共享指针,并且没有利用“新”的C++特性来创建更好的API。 - gatopeich
Poco的HTTP客户端是同步的。 - Sasha Itin


12

C++ (STL)默认没有HTTP或网络库,您需要使用其他工具。

libcurl 可以满足您的需求。cURL++是同样的 libcurl 库,但封装在一个漂亮的C++包装器中。


cURL++的链接似乎已经失效。 - mathematician1975

3

1
谢谢您的建议。 请看一下我在WinHTTP答案中的评论,因为它同样适用于这里。 "// 这个调用在第一次尝试时会失败, // 因为没有分配缓冲区。 if(!HttpQueryInfo(hHttp,HTTP_QUERY_RAW_HEADERS_CRLF, (LPVOID)lpOutBuffer,&dwSize,NULL))" 为了方便使用,WinINet将这些协议抽象成高级接口。 高级接口? 也许20年前它是高级接口... - Piotr Dobrogost
您也可以查看URL moniker:http://msdn.microsoft.com/en-us/library/ms774965(VS.85).aspx,它依赖于WinInet(我认为),但提供类似于COM的接口。 - Eugene
@Piotr:相信我,如果你认为WinHTTP很糟糕,那么你绝对会讨厌WinInet...它是一个令人惊讶的不友好API,即使你习惯于使用C库。最糟糕的部分可能是WinInet常量和错误会“渗透”到更高级别的库中,例如MSXML... WinInet的最大优势在于,如果用户已经通过管理员选项或IE / Internet Options控制面板配置了其帐户的代理设置,则WinInet将自动获取这些设置;其他库可能需要显式配置。但仅限于Windows... - Shog9
并且wininet可以弹出需要用户执行某些操作的GUI界面。 - TakeMeAsAGuest

2
如果是针对Windows的话,可以看一下Windows HTTP服务(WinHTTP)。

http://msdn.microsoft.com/en-us/library/aa384273(VS.85).aspx

微软 Windows HTTP 服务(WinHTTP)为开发人员提供了一个 HTTP 客户端应用程序编程接口(API),以通过 HTTP 协议向其他 HTTP 服务器发送请求。
WinHTTP 提供了 C/C++ 应用程序编程接口(API)和适用于基于 Active Server Pages (ASP) 的应用程序的组件对象模型(COM)自动化组件。
有关 Cookies 的信息,请参见 http://msdn.microsoft.com/en-us/library/aa383261(VS.85).aspx

谢谢您的建议。这里只有纯C,没有任何C++的内容。我真的很想利用Bjarne(http://research.att.com/~bs)的辛勤工作。现在应该禁止在应用程序编程中使用C了几年了 :) - Piotr Dobrogost

2

1

在Windows上,您可以使用IWebBrowser2接口驱动IE。


1
对于那些有高性能要求的人来说,这是一个有效但非常慢的解决方案。 - Kiril

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接