Libreria client HTTP Boost.ASIO (come libcurl)

Sto cercando una moderna libreria HTTP C ++ perché le carenze di libcurl sono difficili da aggirare con i wrapper C ++. Le soluzioni basate su Boost.ASIO, che è diventata la libreria C ++ TCP di fatto, sono preferite.

L’altro giorno qualcuno lo ha consigliato su un altro thread :

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

Penso che questo sia di alto livello come lo troverete, ma non sono sicuro che sia ancora abbastanza maturo (direi che probabilmente lo è da quando lo hanno proposto per l’inclusione di Boost).

Meglio tardi che mai, ecco una nuova risposta a una vecchia domanda. C’è questa nuova libreria open source chiamata Boost.Beast che offre funzionalità sia HTTP che WebSocket usando Boost.Asio. Emula le interfacce familiari di Asio il più fedelmente ansible e ha un sacco di documentazione. Si basa su clang, gcc e Visual Studio usando bjam o CMake – la tua scelta! Nota, sono anche l’autore della biblioteca.

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

Ecco un programma di esempio completo che recupera una pagina 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; } 

Dovresti anche controllare la libreria di rete Pion:

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

C’è questo progetto che prova a “Boostify” libcurl: https://github.com/breese/trial.url

Userò questo come riferimento per progettare l’API client Boost.Http. Tuttavia, ho intenzione di concentrarmi sulle astrazioni di alto livello e provare a collaborare il più ansible con l’autore di Beast.HTTP.