web-dev-qa-db-fra.com

Bibliothèque client HTTP basée sur Boost.ASIO (comme libcurl)

Je recherche une bibliothèque HTTP C++ moderne car les défauts de libcurl sont difficiles à contourner par les wrappers C++. Les solutions basées sur Boost.ASIO, qui est devenue la bibliothèque de facto C++ TCP, sont préférées.

60
Tronic

L'autre jour, quelqu'un a recommandé cela n autre fil :

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

Je pense que c'est aussi élevé que vous le trouverez, mais je ne sais pas encore s'il est suffisamment mature (je dirais que c'est probablement parce qu'ils l'ont proposé pour l'inclusion de Boost).

29
Manuel

Mieux vaut tard que jamais, voici une nouvelle réponse à une vieille question. Il y a cette nouvelle bibliothèque open source appelée Boost.Beast qui offre à la fois la fonctionnalité HTTP et WebSocket en utilisant Boost.Asio. Il émule les interfaces Asio familières aussi près que possible, et sa documentation est abondante. Il s'appuie sur clang, gcc et Visual Studio en utilisant bjam ou CMake - votre choix! Remarque, je suis également l'auteur de la bibliothèque.

https://github.com/boostorg/beast/

Voici un exemple de programme complet qui récupère une page Web:

#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;
}
22
Vinnie Falco
8
Ken

Vous devriez également consulter la bibliothèque du réseau Pion:

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

5
Mike Dickey
2
Dmitri Sosnik

Il y a ce projet essayant de "booster" libcurl: https://github.com/breese/trial.url

Je vais l'utiliser comme référence pour concevoir l'API client Boost.Http. Cependant, je prévois de me concentrer sur les abstractions de haut niveau et d'essayer de collaborer autant que possible avec l'auteur de Beast.HTTP.

1
vinipsmaker