Comment faire une requête HTTP avec le C++?
Est-il un moyen de faire facilement une requête HTTP avec le C++? Plus précisément, je veux télécharger le contenu d'une page (une API) et de vérifier son contenu pour voir si elle contient un 1 ou un 0. Il est également possible de télécharger le contenu dans une chaîne de caractères?
- Non, il n'y a actuellement pas de prise en charge intégrée soit par l'intermédiaire de la langue ou de la bibliothèque standard pour la mise en réseau. Cependant, il y a une mise en Réseau TS N4370. J'ai aussi VTC de cette question, car il attire la bibliothèque de recommandations.
- Que diriez-BoostBeast?
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème. libcurl est vraiment complète. Il y a un wrapper C++ curlpp qui pourraient vous intéresser comme vous vous demandez une bibliothèque C++. néon est un autre élément intéressant de la bibliothèque C qui prennent également en charge WebDAV.
curlpp semble naturel si vous utilisez C++. Il existe de nombreux exemples fournis dans la distribution des sources.
Pour obtenir le contenu d'une URL que vous faire quelque chose comme ça (extrait à partir d'exemples) :
Voir le
examples
répertoire dans curlpp source de distribution, il y a beaucoup de cas plus complexes, ainsi qu'un simple complet minimale de à l'aide de curlpp.mes 2 cents ...
os << myRequest.perform();
avecmyRequest.setOpt( new curlpp::options::WriteStream( &os ) ); myRequest.perform();
a donné des résultats. Assurez-vous de ne pas utiliserhttp://example.com
, cela renvoie une page vide. Mieux utiliser, par exemple,http://www.wikipedia.org
.Windows code:
Ici est une bien meilleure mise en œuvre:
GET / HTTP/1.1.1/... etc
)? Comment puis-je savoir comment faire pour formater ce que je envoyer?Sur Linux, j'ai essayé rpc-netlib, libcurl, curlpp, urdl, boost::asio et considéré comme Qt (mais tourné vers le bas en fonction de la licence). Tous ces sont soit incomplets, pour cet usage, avait bâclé interfaces, avait une mauvaise documentation, ont été laissés à l'abandon ou ne prend pas en charge le protocole https.
Puis, à la suggestion de https://stackoverflow.com/a/1012577/278976, j'ai essayé de POCO. Wow, je souhaite que je l'avais vu il y a des années. Voici un exemple de faire une requête GET HTTP:
http://xjia.heroku.com/2011/09/10/learning-poco-get-with-http/
POCO est gratuit, open source (licence boost). Et non, je n'ai aucune affiliation avec la société; j'aime juste leurs interfaces. Super boulot les gars (et les filles).
http://pocoproject.org/download/index.html
Espère que cela aide quelqu'un... il m'a fallu trois jours pour essayer toutes ces bibliothèques.
Il est plus récent, moins matures curl wrapper développé appelé C++ Demandes. Voici une simple requête GET:
Il prend en charge une grande variété de verbes et curl options. Il y a plus de documentation de l'utilisation ici.
Disclaimer: je suis le responsable de cette bibliothèque.
libCURL est une très bonne option pour vous. En fonction de ce que vous devez faire, le tutoriel devrait vous dire ce que vous voulez, en particulier pour la poignée facile. Mais, fondamentalement, vous pouvez le faire juste pour voir le code source de la page:
Je crois que ce sera la cause de la raison d'être affichée sur la sortie standard. Si vous souhaitez gérer à la place -- ce qui, je suppose, vous le faites, vous devez définir la CURL_WRITEFUNCTION. Tout cela est couvert dans la boucle tutoriel lien ci-dessus.
Que vous voulez une C++ solution, vous pouvez utiliser Qt. Il a un QHttp classe que vous pouvez utiliser.
Vous pouvez vérifier l' docs:
Qt a aussi beaucoup plus à lui que vous pouvez utiliser dans une commune C++ app.
QNetworkAccessManager
a été documentée 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 le obsolète avertissements.Voici mon minimale wrapper autour de cURL pour être en mesure de simplement aller chercher une page web comme une chaîne de caractères. Ceci est utile, par exemple, pour les tests unitaires. Il est fondamentalement un RAII wrapper autour du code C.
Installer "libcurl" sur votre machine
yum install libcurl libcurl-devel
ou l'équivalent.Exemple d'utilisation:
Implémentation de la classe:
Vous voudrez peut-être vérifier C++ RESTE SDK (nom de code "Casablanca"). http://msdn.microsoft.com/en-us/library/jj950081.aspx
Avec le C++ RESTE SDK, vous pouvez plus facilement vous connecter à des serveurs HTTP de votre C++ app.
Exemple d'utilisation:
Le C++ RESTE SDK est un projet Microsoft cloud client-serveur basé sur la communication en code natif à l'aide d'un moderne asynchrone API C++ de conception.
Avec cette réponse je me réfère à la réponse de Software_Developer. En reconstruisant le code que j'ai découvert que certaines parties sont obsolète (
gethostbyname()
) ou ne fournissent pas d'erreur de manipulation (création de supports, l'envoi de quelque chose) pour une opération.Suivantes de code windows est testé avec Visual Studio 2013 et Windows 8.1 64 bits et Windows 7 64 bits. Il cible une adresse IPv4 Connexion TCP avec le Serveur Web de http://www.google.com.
Références:
La dépréciation de gethostbyname
Valeur de retour de socket()
Valeur de retour de send()
C++ ne fournit aucun moyen de le faire directement. Il dépend entièrement de ce que les plates-formes et les bibliothèques que vous avez.
Au pire des cas, vous pouvez utiliser le boost::asio de la bibliothèque d'établir une connexion TCP, envoyer les en-têtes HTTP (RFC 2616), et d'analyser les réponses directement. En regardant les besoins de votre application, c'est assez simple à faire.
Le C et le C++ n'ont pas une bibliothèque standard pour HTTP ou même pour les connexions socket. Avec les années, certains portables bibliothèques ont été développées. Le plus largement utilisé, comme d'autres l'ont dit, est libcurl.
Ici est un liste des alternatives à la libcurl (venant de la libcurl le site web).
Aussi, pour Linux, cette est un simple client HTTP. Vous pouvez implémenter votre propre simple HTTP GET client, mais cela ne fonctionnera pas si il y a d'authentification ou de redirections ou si vous avez besoin de travailler derrière un proxy. Pour ces cas, vous avez besoin d'une véritable bibliothèque comme libcurl.
De code source avec libcurl, cette est le plus proche de ce que vous voulez (Libcurl a beaucoup de exemples). Regardez la fonction principale. Le contenu html seront copiées dans la mémoire tampon, après le succès de la connexion. Il suffit de remplacer parseHtml avec votre propre fonction.
Vous pouvez utiliser embeddedRest de la bibliothèque. Il est léger en-tête de la seule bibliothèque. Donc, il est facile de l'inclure à votre projet et il ne nécessite pas de compilation car il n'y a pas de
.cpp
fichiers.Exemple de demande de
readme.md
de repo:netdb.h
etc, donc j'aimerais un peu d'aide oui#ifdef _WIN32
et d'y ajouter des fenêtres de code spécifique. Regardez ici - il n'y a pas beaucoup de différence entre les sockets unix et windows sockets. Je vois deux différences principales: 1) appelWSAStartup
premier et 2) l'utilisationclosesocket
au lieu declose
Le protocole HTTP est très simple, il est donc très simple à écrire un client HTTP.
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 sont les paramètres de ligne de commande. Le fichier distant est enregistré sur une copie locale.
Disclaimer: je suis l'auteur
EDIT: édité URL
Voici un code qui fonctionne sans avoir besoin d'utiliser un 3ème partie de la bibliothèque:
D'abord définir votre passerelle, utilisateur, mot de passe et les autres paramètres que vous devez envoyer à ce serveur spécifique.
Voici le code en lui-même:
Qui doit travailler sur une API Win32 environnement.
Voici un exemple.
InternetConnect
renvoie la valeur null lorsque l'URL complète est donnée, mais renvoie la valeur null lorsque seul le nom de domaine est fourni. Alors, quand/où puis-je utiliser l'URL complète pour obtenir la page que je veux télécharger?Voici quelques (relativement) simple C++11 du code qui utilise libCURL pour télécharger une URL du contenu dans un
std::vector<char>
:http_download.hh
http_download.cc
En général, je recommande quelque chose de croix-plate-forme comme cURL, POCO, ou Qt. Cependant, ici, c'est un Windows exemple!:
Notez que cela ne nécessite pas de libcurl, Windows.h, ou WinSock! Pas de compilation de bibliothèques, pas de configuration de projet, etc. J'ai ce code de travail dans Visual Studio 2017 c++ sur Windows 10:
Je viens de comprendre comment faire cela, parce que je voulais un simple accès aux API de script, des bibliothèques comme la libcurl ont été me causer toutes sortes de problèmes (même si j'ai suivi les instructions...), et c'est juste trop bas niveau et compliqué.
Je ne suis pas sûr de tous les IStream lecture de code (en particulier la condition du while - n'hésitez pas à corriger/améliorer), mais bon, il fonctionne, sans tracas! (Il fait sens pour moi que, depuis que j'ai utilisé un de blocage (synchrone) appel, c'est bien, c'
bytesRead
serait toujours > 0U jusqu'à ce que le flux (ISequentialStream?) est fini d'être lu, mais qui sait.)Voir aussi: Noms d'URL et Asynchrone Protocole Enfichable Référence
.str()
appel à la fin convertit le flux dans une chaîne unique, qui est généralement la façon dont nous voulons traiter dans notre propre code, une fois terminé.Si vous êtes à la recherche pour un client HTTP bibliothèque en C++, qui est pris en charge de multiples plates-formes (Linux, Windows et Mac) pour consommer des services web Restful. Vous pouvez avoir des options ci-dessous.
Bien qu'un peu tard. Vous préférerez peut-être https://github.com/Taymindis/backcurl .
Il permet de faire appel http sur mobile, développement en c++. Adapté pour le jeu Mobile de développement
Vous pouvez utiliser ACE afin de le faire: