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

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

L’autre jour, quelqu’un a recommandé ceci sur un autre sujet :

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

Je pense que c’est à un niveau aussi élevé que vous le trouverez, mais je ne suis pas sûr qu’il soit suffisamment mature (je dirais que c’est probablement depuis qu’ils l’ont proposé pour l’inclusion de Boost).

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 les fonctionnalités HTTP et WebSocket en utilisant Boost.Asio. Il émule au mieux les interfaces Asio habituelles et sa documentation est abondante. Il se base sur clang, gcc et Visual Studio en utilisant bjam ou CMake – votre choix! Note, je suis aussi 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  #include  #include  #include  #include  #include  #include  #include  using tcp = boost::asio::ip::tcp; // from  namespace http = boost::beast::http; // from  // 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    []\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 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 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; } 

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

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

Il y a ce projet en essayant de “booster” libcurl: https://github.com/breese/sortingal.url

Je l’utiliserai comme référence pour concevoir l’API client Boost.Http. Cependant, je compte me concentrer sur les abstractions de haut niveau et essayer de collaborer le plus possible avec l’auteur Beast.HTTP.