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)
risposta
Il giorno altro qualcuno consigliato questo su another thread:
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).
Ho trascorso una discreta quantità di tempo per capire che HTTPS non è ancora supportato. Questo chiaramente non è ancora maturo, se mai lo sarà. – Homer6
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
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
Si dovrebbe anche controllare il Pion Network Library:
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
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
ASIO autore implementare:
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
Sì, ma è davvero funzionante. – Ken
Boost.Http - un nuovo giocatore qui: https://github.com/BoostGSoC14/boost.http, docs - http://boostgsoc14.github.io/boost.http/
Tuttavia, al momento, questo è solo lato server. – Xoph
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;
}
Ho aggiunto una nota che spiega che sono l'autore. –
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
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.
- 1. Boost.Asio libreria HTTP
- 2. Come utilizzare libcurl per il post HTTP?
- 3. HTTP get Richiesta utilizzando C WITHOUT libCurl
- 4. Struttura http del nodo basata su promessa?
- 5. Invia intestazione HTTP vuota con libcurl
- 6. Come impacchettare la libreria basata su molla per il riutilizzo?
- 7. Libreria client HTTP C/C++ per progetti incorporati
- 8. Ruby Equivalent della libreria Richieste Python (Client HTTP)
- 9. libcurl Errore CURLE_SSL_CACERT_BADFILE su android
- 10. Esempio di client HTTP su win32
- 11. client http twistato
- 12. Abilitazione della cultura basata su client in Asp.Net Core
- 13. Client REST/HTTP integrato Groovy?
- 14. Client WebSocket Kit HTTP
- 15. Caricamento su Amazon S3 utilizzando cURL/libcurl
- 16. Come utilizzare libcurl su Qt Creator con MSVC2012 come compilatore
- 17. collegamento boost.asio
- 18. porting libcurl su android con supporto ssl
- 19. Boost.Asio: Operazione annullata a async_read
- 20. JARS necessari per distribuire la libreria basata su Eclipse EMF?
- 21. Libreria Haskell per comunicazione HTTP
- 22. Haskell - Mutazione basata su attore
- 23. Libreria Java HTTP Server
- 24. WebView con client HTTP personalizzato
- 25. Libreria client EMail
- 26. Intercettazione basata sull'intestazione HTTP in RESTeasy
- 27. Come verificare se una libreria è basata su 32 bit/64 bit su Mac OS X?
- 28. Apache http client o URLConnection
- 29. Boost.Asio sbagliato locale endpoint
- 30. Come testare Akka HTTP lato client
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
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
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