2010-02-12 6 views
57

Je suis à la recherche d'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 C++ TCP de facto, sont préférées.Bibliothèque de client HTTP Boost.ASIO (comme libcurl)

+5

Salut. Je me demandais juste ce que vous avez fini par utiliser? J'ai un scénario similaire (client http C++ nécessaire). Avez-vous fini par utiliser la bibliothèque réseau C++ proposée ci-dessous ou une autre bibliothèque? THX. – skimobear

+0

Oui, j'ai utilisé cpp-netlib. Il est plutôt minimaliste (ou la documentation * très * minimaliste manque de fonctionnalités) et à cause de cela vous devez faire des choses telles que l'authentification de base HTTP à la main (en ajoutant l'en-tête approprié plutôt que de spécifier login/mot de passe). Ça va être très bien s'ils continuent juste le développement et il est certainement utilisable actuellement (et être en tête seulement est un gros plus). – Tronic

+3

Pour l'anecdote, j'ai récemment rencontré un problème avec cpp-netlib car il prend beaucoup trop de temps à compiler et vous aurez besoin de plus de 1 Go de RAM même pour les choses les plus simples (avec GCC). Donc, à tout le moins, isolez vos fonctions get/post dans un module source distinct que vous n'avez jamais besoin de modifier ou de recompiler, et n'incluez pas cette bibliothèque ailleurs que dans l'implémentation de celle-ci. – Tronic

Répondre

28

L'autre jour, quelqu'un a recommandé ceci sur another thread:

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

Je pense que cela est aussi haut niveau que vous trouverez, mais je ne suis pas sûr si elle est encore assez mature (je dirais c'est probablement parce qu'ils l'ont proposé pour l'inclusion de Boost).

+5

J'ai passé pas mal de temps à me rendre compte que HTTPS n'est pas encore supporté. Ce n'est clairement pas encore mature, si jamais il le sera. – Homer6

+1

Malheureusement, ce serait génial si cela a fonctionné. Il manque beaucoup de fonctionnalités et quand je l'ai utilisé pour la dernière fois, cela a fortement étouffé les réponses en morceaux. Cela m'a rendu très triste car la conception des interfaces utilisateur pour cette bibliothèque est très simple et plutôt préférée. – Bob9630

+0

Cette bibliothèque est simple, juste pour obtenir des fichiers à partir de serveurs HTTP ou pour créer votre propre serveur/client HTTP simple. Mais c'est exactement ce dont j'ai besoin! Libcurl est souvent exagéré. – vitakot

5

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

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

+0

J'ai finalement eu un coup d'oeil sur ce sujet, mais il semble être seulement serveur (bien que pas tout à fait clair de la documentation). Docs très minimes mais au moins le code semble être activement maintenu. – Tronic

+0

Utilise la bibliothèque Pion depuis 8 mois. Principalement utiliser les composants du serveur, mais aussi utilisé était un client. Les deux fonctionnent vraiment bien. Le seul problème rencontré jusqu'à présent est la taille maximale du contenu (1 Mo) de la classe HttpResponse. Nous avons dû dériver de HttpResponse afin de définir une limite supérieure. Le serveur est solide comme le roc. – Scottymac

8
+0

Maintenant, en 2012, ce projet semble plutôt mort puisque les pages que je peux y trouver n'ont pas été mises à jour depuis 2009. Aussi l'interface async est de très bas niveau (comme asio) et donc peu conviviale. Fonctionnalité très minimale, documentation très minimale. – Tronic

+0

Oui, mais c'est vraiment travaillé. – Ken

13

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 des fonctionnalités HTTP et WebSocket en utilisant Boost.Asio. Il émule les interfaces Asio familiers aussi étroitement que possible, et il a beaucoup de documentation. Il s'appuie sur clang, gcc et Visual Studio en utilisant soit bjam ou CMake - votre choix! Remarque, 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 <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

J'ai ajouté une note expliquant que je suis l'auteur. –

+1

Peut-être vaut la peine d'être mis à jour pour noter que Beast, bien que toujours en version bêta au moment de la rédaction, a été accepté pour incorporation dans Boost? Cf. http://www.boost.org/doc/libs/develop/libs/beast/doc/html/beast.html Félicitations à l'auteur! – Tommy

0

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

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