C++ 基于 Boost.ASIO 的 HTTP 客户端库(如 libcurl)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2251361/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Boost.ASIO-based HTTP client library (like libcurl)
提问by Tronic
I am looking for a modern C++ HTTP library because libcurl's shortcomings are difficult to work around by C++ wrappers. Solutions based on Boost.ASIO, which has become the de-facto C++ TCP library, are preferred.
我正在寻找一个现代 C++ HTTP 库,因为 C++ 包装器很难解决 libcurl 的缺点。首选基于 Boost.ASIO(已成为事实上的 C++ TCP 库)的解决方案。
采纳答案by Manuel
The other day somebody recommended this on another thread:
前几天有人在另一个线程上推荐了这个:
I think this is as high-level as you will find, but I'm not sure if it's mature enough yet (I would say it probably is since they've proposed it for Boost inclusion).
我认为这和你会发现的一样高,但我不确定它是否足够成熟(我想说这可能是因为他们已经提议将它包含在 Boost 中)。
回答by Vinnie Falco
Better late than never, here's a new answer to an old question. There's this new open source library called Boost.Beast which offers both HTTP and WebSocket functionality using Boost.Asio. It emulates the familiar Asio interfaces as closely as possible, and its got plenty of documentation. It builds on clang, gcc, and Visual Studio using either bjam or CMake - your choice! Note, I am also the author of the library.
迟到总比不到好,这是一个老问题的新答案。有一个名为 Boost.Beast 的新开源库,它使用 Boost.Asio 提供 HTTP 和 WebSocket 功能。它尽可能地模拟熟悉的 Asio 界面,并且有大量的文档。它构建在 clang、gcc 和 Visual Studio 上,使用 bjam 或 CMake - 您的选择!请注意,我也是该库的作者。
https://github.com/boostorg/beast/
https://github.com/boostorg/beast/
Here's a complete example program that retrieves a web page:
这是一个检索网页的完整示例程序:
#include <boost/beast/core.hpp>
#include <boost/beast/http.hpp>
#include <boost/beast/version.hpp>
#include <boost/asio/connect.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <cstdlib>
#include <iostream>
#include <string>
using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
namespace http = boost::beast::http; // from <boost/beast/http.hpp>
// Performs an HTTP GET and prints the response
int main(int argc, char** argv)
{
try
{
// Check command line arguments.
if(argc != 4 && argc != 5)
{
std::cerr <<
"Usage: http-client-sync <host> <port> <target> [<HTTP version: 1.0 or 1.1(default)>]\n" <<
"Example:\n" <<
" http-client-sync www.example.com 80 /\n" <<
" http-client-sync www.example.com 80 / 1.0\n";
return EXIT_FAILURE;
}
auto const host = argv[1];
auto const port = argv[2];
auto const target = argv[3];
int version = argc == 5 && !std::strcmp("1.0", argv[4]) ? 10 : 11;
// The io_context is required for all I/O
boost::asio::io_context ioc;
// These objects perform our I/O
tcp::resolver resolver{ioc};
tcp::socket socket{ioc};
// Look up the domain name
auto const results = resolver.resolve(host, port);
// Make the connection on the IP address we get from a lookup
boost::asio::connect(socket, results.begin(), results.end());
// Set up an HTTP GET request message
http::request<http::string_body> req{http::verb::get, target, version};
req.set(http::field::host, host);
req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
// Send the HTTP request to the remote host
http::write(socket, req);
// This buffer is used for reading and must be persisted
boost::beast::flat_buffer buffer;
// Declare a container to hold the response
http::response<http::dynamic_body> res;
// Receive the HTTP response
http::read(socket, buffer, res);
// Write the message to standard out
std::cout << res << std::endl;
// Gracefully close the socket
boost::system::error_code ec;
socket.shutdown(tcp::socket::shutdown_both, ec);
// not_connected happens sometimes
// so don't bother reporting it.
//
if(ec && ec != boost::system::errc::not_connected)
throw boost::system::system_error{ec};
// If we get here then the connection is closed gracefully
}
catch(std::exception const& e)
{
std::cerr << "Error: " << e.what() << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
回答by Ken
asio author implement:
asio 作者实现:
回答by Mike Dickey
You should also check out the Pion Network Library:
您还应该查看 Pion 网络库:
回答by Dmitri Sosnik
Boost.Http - a new player here: https://github.com/BoostGSoC14/boost.http, docs - http://boostgsoc14.github.io/boost.http/
Boost.Http - 这里的新玩家:https://github.com/BoostGSoC14/boost.http,文档 - http://boostgsoc14.github.io/boost.http/
回答by vinipsmaker
There's this project trying to "Boostify" libcurl: https://github.com/breese/trial.url
有这个项目试图“提升”libcurl:https: //github.com/breese/trial.url
I'll use this as a reference to design Boost.Http client API. However, I plan to focus on high-level abstractions and try to collaborate as much as possible with Beast.HTTP author.
我将以此作为设计 Boost.Http 客户端 API 的参考。但是,我计划专注于高级抽象,并尝试与 Beast.HTTP 作者尽可能多地合作。