Existe-t-il un moyen de faire facilement une requête HTTP avec C ++? Plus précisément, je souhaite télécharger le contenu d'une page (une API) et vérifier le contenu pour voir s'il contient un 1 ou un 0. Est-il également possible de télécharger le contenu dans une chaîne?
c++
httprequest
Sam152
la source
la source
Réponses:
J'ai eu le même problème. libcurl est vraiment complet. Il existe un curlpp wrapper C ++ qui pourrait vous intéresser lorsque vous demandez une bibliothèque C ++. neon est une autre bibliothèque C intéressante qui prend également en charge WebDAV .
curlpp semble naturel si vous utilisez C ++. Il existe de nombreux exemples fournis dans la distribution source. Pour obtenir le contenu d'une URL, vous faites quelque chose comme ça (extrait d'exemples):
Voir le
examples
répertoire dans la distribution source de curlpp , il y a beaucoup de cas plus complexes, ainsi qu'un cas simple, complet et minimal utilisant curlpp.mes 2 cents ...
la source
os << myRequest.perform();
par amyRequest.setOpt( new curlpp::options::WriteStream( &os ) ); myRequest.perform();
donné des résultats. Assurez-vous de ne pas utiliserhttp://example.com
, cela retournera une page vide. Mieux utiliser par exemplehttp://www.wikipedia.org
.Code Windows:
Voici une bien meilleure implémentation:
la source
GET / HTTP/1.1.1/... etc
)? Comment savoir comment formater ce que j'envoie?Mise à jour 2020: j'ai une nouvelle réponse qui remplace celle-ci, maintenant âgée de 8 ans, une: https://stackoverflow.com/a/61177330/278976
Sous Linux, j'ai essayé cpp-netlib, libcurl, curlpp, urdl, boost :: asio et j'ai considéré Qt (mais je l'ai refusé en fonction de la licence). Tous ces éléments étaient incomplets pour cette utilisation, avaient des interfaces bâclées, avaient une mauvaise documentation, n'étaient pas entretenus ou ne prenaient pas en charge https.
Ensuite, à la suggestion de https://stackoverflow.com/a/1012577/278976 , j'ai essayé POCO. Wow, j'aurais aimé voir ça il y a des années. Voici un exemple de création d'une demande HTTP GET avec POCO:
https://stackoverflow.com/a/26026828/2817595
POCO est gratuit, open source (licence boost). Et non, je n'ai aucune affiliation avec l'entreprise; J'aime vraiment leurs interfaces. Grands gars de travail (et filles).
https://pocoproject.org/download.html
J'espère que cela aide quelqu'un ... il m'a fallu trois jours pour essayer toutes ces bibliothèques.
la source
Un wrapper de boucle plus récent et moins mature est en cours de développement, appelé Requêtes C ++ . Voici une simple demande GET:
Il prend en charge une grande variété d'options de verbes et de boucles HTTP. Il y a plus de documentation d'utilisation ici .
Avertissement: je suis le mainteneur de cette bibliothèque .
la source
Voici mon enveloppe minimale autour de cURL pour pouvoir simplement récupérer une page Web sous forme de chaîne. Ceci est utile, par exemple, pour les tests unitaires. Il s'agit essentiellement d'un wrapper RAII autour du code C.
Installez "libcurl" sur votre machine
yum install libcurl libcurl-devel
ou équivalent.Exemple d'utilisation:
Implémentation de classe:
la source
libCURL est une assez bonne option pour vous. Selon ce que vous devez faire, le didacticiel devrait vous dire ce que vous voulez, en particulier pour la poignée facile. Mais, en gros, vous pouvez le faire juste pour voir la source d'une page:
Je crois que cela entraînera l'impression du résultat sur stdout. Si vous voulez le gérer à la place - ce qui, je suppose, vous le faites - vous devez définir la CURL_WRITEFUNCTION. Tout cela est couvert dans le tutoriel curl lié ci-dessus.
la source
Comme vous voulez une solution C ++, vous pouvez utiliser Qt . Il a une classe QHttp que vous pouvez utiliser.
Vous pouvez consulter les documents :
Qt a également beaucoup plus que vous pouvez utiliser dans une application C ++ commune.
la source
QNetworkAccessManager
a été documenté depuis Qt 4.4; et dans Qt 4.8 dit:QHttp - This class is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code.
Donc je suppose qu'il est toujours disponible, si vous ignorez les avertissements obsolètes.Vous pouvez vérifier le SDK REST C ++ (nom de code "Casablanca"). http://msdn.microsoft.com/en-us/library/jj950081.aspx
Avec le SDK C ++ REST, vous pouvez plus facilement vous connecter aux serveurs HTTP à partir de votre application C ++.
Exemple d'utilisation:
Le SDK C ++ REST est un projet Microsoft pour la communication client-serveur basée sur le cloud en code natif à l'aide d'une conception d'API C ++ asynchrone moderne.
la source
Avec cette réponse, je me réfère à la réponse de Software_Developer . En reconstruisant le code, j'ai trouvé que certaines parties sont obsolètes (
gethostbyname()
) ou ne fournissent pas de gestion des erreurs (création de sockets, envoi de quelque chose) pour une opération.Le code Windows suivant est testé avec Visual Studio 2013 et Windows 8.1 64 bits ainsi que Windows 7 64 bits. Il ciblera une connexion TCP IPv4 avec le serveur Web de www.google.com.
Références:
Obsolescence de gethostbyname
Valeur de retour de socket ()
Valeur de retour de send ()
la source
C ++ ne fournit aucun moyen de le faire directement. Cela dépendrait entièrement des plates-formes et bibliothèques dont vous disposez.
Dans le pire des cas, vous pouvez utiliser la bibliothèque boost :: asio pour établir une connexion TCP, envoyer les en-têtes HTTP (RFC 2616) et analyser directement les réponses. En regardant les besoins de votre application, c'est assez simple à faire.
la source
Voici du code qui fonctionnera sans avoir besoin d'utiliser une bibliothèque tierce: Définissez d'abord votre passerelle, votre utilisateur, votre mot de passe et tout autre paramètre que vous devez envoyer à ce serveur spécifique.
Voici le code lui-même:
Cela devrait fonctionner sur un environnement API Win32.
Voici un exemple .
la source
InternetConnect
renvoie null lorsque l'URL complète est donnée, mais renvoie une valeur non nulle lorsque seul le nom de domaine est fourni. Alors, quand / où utiliser l'URL complète pour obtenir la page que je souhaite télécharger?Réponse mise à jour pour avril 2020:
J'ai eu beaucoup de succès, récemment, avec cpp-httplib (en tant que client et serveur). Il est mature et son RPS à filetage unique approximatif est d'environ 6k.
De plus, il existe un cadre très prometteur, cpv-framework , qui peut obtenir environ 180k RPS sur deux cœurs (et évoluera bien avec le nombre de cœurs car il est basé sur le cadre seastar , qui alimente les bases de données les plus rapides sur la planète, scylladb ).
Cependant, le framework cpv est encore relativement immature; donc, pour la plupart des utilisations, je recommande fortement cpp-httplib.
Cette recommandation remplace ma réponse précédente (il y a 8 ans).
la source
C et C ++ n'ont pas de bibliothèque standard pour HTTP ou même pour les connexions socket. Au fil des ans, certaines bibliothèques portables ont été développées. Le plus largement utilisé, comme d'autres l'ont dit, est libcurl .
Voici une liste d'alternatives à libcurl (provenant du site Web de libcurl).
De plus, pour Linux, il s'agit d'un simple client HTTP. Vous pouvez implémenter votre propre client HTTP GET simple, mais cela ne fonctionnera pas s'il y a une authentification ou des redirections impliquées ou si vous devez travailler derrière un proxy. Pour ces cas, vous avez besoin d'une bibliothèque complète comme libcurl.
Pour le code source avec libcurl, c'est le plus proche de ce que vous voulez (libcURL a beaucoup d' exemples ). Regardez la fonction principale. Le contenu html sera copié dans le tampon, après une connexion réussie. Remplacez simplement parseHtml par votre propre fonction.
la source
Vous pouvez utiliser la bibliothèque embeddedRest . Il s'agit d'une bibliothèque légère uniquement en-tête. Il est donc facile de l'inclure dans votre projet et il ne nécessite pas de compilation car il ne contient aucun
.cpp
fichier.Exemple de demande
readme.md
de repo:la source
netdb.h
etc donc je voudrais de l'aide oui#ifdef _WIN32
et d'y ajouter du code spécifique à Windows. Regardez ici - il n'y a pas beaucoup de différence entre les sockets unix et les sockets windows. Je vois deux différences principales: 1) appeler d'WSAStartup
abord et 2) utiliserclosesocket
au lieu declose
Le protocole HTTP est très simple, il est donc très simple d'écrire un client HTTP. En voici un
https://github.com/pedro-vicente/lib_netsockets
Il utilise HTTP GET pour récupérer un fichier à partir d'un serveur Web, le serveur et le fichier étant des paramètres de ligne de commande. Le fichier distant est enregistré sur une copie locale.
Avertissement: je suis l'auteur
MODIFIER: URL modifiée
la source
Notez que cela ne nécessite pas libcurl, Windows.h ou WinSock! Aucune compilation de bibliothèques, aucune configuration de projet, etc. J'ai ce code qui fonctionne dans Visual Studio 2017 c ++ sur Windows 10:
Je viens de comprendre comment faire cela, car je voulais un script d'accès API simple, des bibliothèques comme libcurl me causaient toutes sortes de problèmes (même lorsque j'ai suivi les instructions ...), et WinSock est tout simplement trop bas et compliqué .
Je ne suis pas tout à fait sûr de tout le code de lecture IStream (en particulier la condition while - n'hésitez pas à corriger / améliorer), mais bon, cela fonctionne , sans tracas! (Il est logique pour moi que, puisque j'ai utilisé un appel de blocage (synchrone) , cela ne pose aucun problème , ce
bytesRead
serait toujours> 0U jusqu'à ce que le flux ( ISequentialStream ?) Soit terminé en lecture, mais qui sait.)Voir aussi: Monikers URL et référence de protocole enfichable asynchrone
la source
Voici du code C ++ 11 (relativement) simple qui utilise libCURL pour télécharger le contenu d'une URL dans un
std::vector<char>
:http_download.hh
http_download.cc
la source
En général, je recommanderais quelque chose de multiplateforme comme cURL, POCO ou Qt. Cependant, voici un exemple Windows!:
la source
Si vous recherchez une bibliothèque client HTTP en C ++ prise en charge sur plusieurs plates-formes (Linux, Windows et Mac) pour la consommation de services Web Restful. Vous pouvez avoir les options ci-dessous.
la source
Bien qu'un peu tard. Vous pouvez préférer https://github.com/Taymindis/backcurl .
Il vous permet de faire des appels http sur le développement mobile c ++. Convient pour le développement de jeux mobiles
la source
Pour ce faire, vous pouvez utiliser ACE:
la source