2010-02-12 11 views
57

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.Libreria client HTTP basata su Boost.ASIO (come libcurl)

+5

Ciao. mi chiedo solo che cosa hai usato? Ho uno scenario simile (è necessario il client http C++). Hai finito per utilizzare la libreria di rete C++ proposta di seguito o un'altra libreria? grazie. – skimobear

+0

Sì, ho usato cpp-netlib. È piuttosto minimalista (o la documentazione * molto * minimalista manca di funzionalità) e per questo devi fare cose come l'autenticazione di base HTTP a mano (aggiungendo l'intestazione appropriata invece di specificare login/password). Sarà molto buono se continueranno lo sviluppo ed è certamente utilizzabile al momento (e l'intestazione è un grande vantaggio). – Tronic

+3

Per la cronaca, recentemente ho avuto un problema con cpp-netlib perché richiede troppo tempo per essere compilato e avrete bisogno di più di 1 GB di RAM anche per le cose più semplici (con GCC). Quindi, per lo meno, isola le tue funzioni get/post in un modulo sorgente separato che non hai mai bisogno di modificare o ricompilare, e non includi questa libreria in nessun'altra parte che nella sua implementazione. – Tronic

risposta

28

Il giorno altro qualcuno consigliato questo su another thread:

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

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

+5

Ho trascorso una discreta quantità di tempo per capire che HTTPS non è ancora supportato. Questo chiaramente non è ancora maturo, se mai lo sarà. – Homer6

+1

Sfortunatamente sarebbe bello se funzionasse. Manca un sacco di funzionalità e quando l'ho usato per l'ultima volta, ha soffocato pesantemente sulle risposte chunked. Mi ha reso molto triste il fatto che il design delle interfacce utente per questa libreria sia molto semplice e piuttosto preferito. – Bob9630

+0

Questa libreria è semplice, solo per ottenere file da server HTTP o per creare il tuo semplice server/client HTTP. Ma questo è esattamente ciò di cui ho bisogno! Libcurl è spesso eccessivo. – vitakot

5

Si dovrebbe anche controllare il Pion Network Library:

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

+0

Ho finalmente avuto un aspetto corretto su questo ma sembra essere solo server (anche se non del tutto chiaro dalla documentazione). Documenti molto minimali ma almeno il codice sembra essere mantenuto attivamente. – Tronic

+0

Utilizzano la libreria Pion da 8 mesi. Utilizzare principalmente i componenti del server, ma hanno anche utilizzato un client. Entrambi funzionano molto bene. L'unico problema riscontrato finora è la dimensione massima del contenuto (1 MB) della classe HttpResponse. Dovevamo derivare da HttpResponse per impostare un limite più alto. Il server è solido come una roccia. – Scottymac

8
+0

Ora, nel 2012, questo progetto sembra piuttosto morto in quanto le pagine che posso trovare su di esso non sono state aggiornate dal 2009. Anche l'interfaccia asincrona è di livello molto basso (come asio) e quindi non molto user-friendly. Funzionalità minime, documentazione molto minimale. – Tronic

+0

Sì, ma è davvero funzionante. – Ken

13

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 possibile 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 <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; 
} 
+0

Ho aggiunto una nota che spiega che sono l'autore. –

+1

Forse vale la pena aggiornarlo per notare che Beast, sebbene sia ancora in beta al momento della stesura, è stato accettato per l'incorporazione in Boost? Cf. http://www.boost.org/doc/libs/develop/libs/beast/doc/html/beast.html Congratulazioni all'autore! – Tommy

0

C'è questo progetto cercando di libcurl "Boostify": https://github.com/breese/trial.url

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