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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-27 22:42:30  来源:igfitidea点击:

Boost.ASIO-based HTTP client library (like libcurl)

c++httpcurlboost-asio

提问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:

前几天有人在另一个线程上推荐了这个:

http://cpp-netlib.github.com/

http://cpp-netlib.github.com/

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 Mike Dickey

You should also check out the Pion Network Library:

您还应该查看 Pion 网络库:

http://pion.org/projects/pion-network-library

http://pion.org/projects/pion-network-library

回答by Dmitri Sosnik

回答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 作者尽可能多地合作。