Gibt es eine Möglichkeit, mit C ++ einfach eine HTTP-Anfrage zu stellen? Insbesondere möchte ich den Inhalt einer Seite (einer API) herunterladen und den Inhalt überprüfen, um festzustellen, ob er eine 1 oder eine 0 enthält. Ist es auch möglich, den Inhalt in eine Zeichenfolge herunterzuladen?
c++
httprequest
Sam152
quelle
quelle
Antworten:
Ich hatte das gleiche Problem. libcurl ist wirklich vollständig. Es gibt einen C ++ - Wrapper- Curlpp , der Sie interessieren könnte, wenn Sie nach einer C ++ - Bibliothek fragen. neon ist eine weitere interessante C-Bibliothek, die auch WebDAV unterstützt .
curlpp scheint natürlich, wenn Sie C ++ verwenden. Die Quelldistribution enthält viele Beispiele. Um den Inhalt einer URL zu erhalten, gehen Sie wie folgt vor (aus Beispielen extrahiert):
Sehen Sie sich das
examples
Verzeichnis in der Curlpp-Quelldistribution an , es gibt viele komplexere Fälle sowie ein einfaches, vollständiges Minimal mit Curlpp.meine 2 Cent ...
quelle
os << myRequest.perform();
durchmyRequest.setOpt( new curlpp::options::WriteStream( &os ) ); myRequest.perform();
ergab jedoch Ergebnisse. Stellen Sie sicher, dass Sie diese Option nicht verwendenhttp://example.com
. Dadurch wird eine leere Seite zurückgegeben. Besser zB verwendenhttp://www.wikipedia.org
.Windows-Code:
Hier ist eine viel bessere Implementierung:
quelle
GET / HTTP/1.1.1/... etc
)? Wie finde ich heraus, wie ich das, was ich sende, formatiere?Update 2020: Ich habe eine neue Antwort, die diese jetzt 8-jährige ersetzt: https://stackoverflow.com/a/61177330/278976
Unter Linux habe ich cpp-netlib, libcurl, curlpp, urdl, boost :: asio ausprobiert und Qt in Betracht gezogen (aber basierend auf der Lizenz abgelehnt). Alle diese waren entweder für diese Verwendung unvollständig, hatten schlampige Schnittstellen, hatten eine schlechte Dokumentation, waren nicht gewartet oder unterstützten https nicht.
Dann habe ich auf Vorschlag von https://stackoverflow.com/a/1012577/278976 POCO ausprobiert. Wow, ich wünschte ich hätte das vor Jahren gesehen. Hier ist ein Beispiel für eine HTTP-GET-Anforderung mit POCO:
https://stackoverflow.com/a/26026828/2817595
POCO ist kostenlos, Open Source (Boost-Lizenz). Und nein, ich bin dem Unternehmen nicht angeschlossen. Ich mag ihre Schnittstellen einfach sehr. Tolle Arbeit Jungs (und Mädels).
https://pocoproject.org/download.html
Ich hoffe, das hilft jemandem ... ich habe drei Tage gebraucht, um all diese Bibliotheken auszuprobieren.
quelle
Es wird ein neuerer, weniger ausgereifter Curl-Wrapper namens C ++ Requests entwickelt . Hier ist eine einfache GET-Anfrage:
Es unterstützt eine Vielzahl von HTTP-Verben und Curl-Optionen. Es gibt mehr Nutzungs Dokumentation hier .
Haftungsausschluss: Ich bin der Betreuer dieser Bibliothek .
quelle
Hier ist mein minimaler Wrapper um cURL, um einfach eine Webseite als String abrufen zu können. Dies ist beispielsweise für Unit-Tests nützlich. Es ist im Grunde ein RAII-Wrapper um den C-Code.
Installieren Sie "libcurl" auf Ihrem Computer
yum install libcurl libcurl-devel
oder einem gleichwertigen Computer .Anwendungsbeispiel:
Klassenimplementierung:
quelle
libCURL ist eine ziemlich gute Option für Sie. Je nachdem, was Sie tun müssen, sollte das Tutorial Ihnen sagen, was Sie wollen, speziell für die einfache Handhabung. Grundsätzlich können Sie dies jedoch tun, um die Quelle einer Seite anzuzeigen:
Ich glaube, dies wird dazu führen, dass das Ergebnis auf stdout gedruckt wird. Wenn Sie stattdessen damit umgehen möchten - was Sie vermutlich tun -, müssen Sie die CURL_WRITEFUNCTION festlegen. All dies wird in dem oben verlinkten Curl-Tutorial behandelt.
quelle
Wenn Sie eine C ++ - Lösung wünschen, können Sie Qt verwenden . Es hat eine QHttp-Klasse, die Sie verwenden können.
Sie können die Dokumente überprüfen :
Qt bietet noch viel mehr, das Sie in einer gängigen C ++ - App verwenden können.
quelle
QNetworkAccessManager
wurde seit Qt 4.4 dokumentiert; und in Qt 4.8 heißt es:QHttp - This class is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code.
Ich denke, es ist immer noch verfügbar, wenn Sie die veralteten Warnungen ignorieren.Möglicherweise möchten Sie das C ++ REST SDK (Codename "Casablanca") überprüfen . http://msdn.microsoft.com/en-us/library/jj950081.aspx
Mit dem C ++ REST SDK können Sie von Ihrer C ++ - App aus einfacher eine Verbindung zu HTTP-Servern herstellen.
Anwendungsbeispiel:
Das C ++ REST SDK ist ein Microsoft-Projekt für die Cloud-basierte Client-Server-Kommunikation in nativem Code unter Verwendung eines modernen asynchronen C ++ - API-Designs.
quelle
Mit dieser Antwort verweise ich auf die Antwort von Software_Developer . Beim Neuerstellen des Codes stellte ich fest, dass einige Teile veraltet sind (
gethostbyname()
) oder keine Fehlerbehandlung (Erstellen von Sockets, Senden von etwas) für eine Operation bieten .Der folgende Windows-Code wird mit Visual Studio 2013 und Windows 8.1 64-Bit sowie Windows 7 64-Bit getestet. Es zielt auf eine IPv4-TCP-Verbindung mit dem Webserver von www.google.com ab.
Verweise:
Verfall von gethostbyname
Rückgabewert von Socket ()
Rückgabewert von send ()
quelle
C ++ bietet keine Möglichkeit, dies direkt zu tun. Es würde ganz davon abhängen, welche Plattformen und Bibliotheken Sie haben.
Im schlimmsten Fall können Sie die boost :: asio-Bibliothek verwenden, um eine TCP-Verbindung herzustellen, die HTTP-Header (RFC 2616) zu senden und die Antworten direkt zu analysieren. Mit Blick auf Ihre Anwendungsanforderungen ist dies einfach genug.
quelle
Hier ist ein Code, der funktioniert, ohne dass eine Bibliothek eines Drittanbieters verwendet werden muss: Definieren Sie zuerst Ihr Gateway, Ihren Benutzer, Ihr Kennwort und alle anderen Parameter, die Sie an diesen bestimmten Server senden müssen.
Hier ist der Code selbst:
Das sollte in einer Win32-API-Umgebung funktionieren.
Hier ist ein Beispiel .
quelle
InternetConnect
Gibt null zurück, wenn die vollständige URL angegeben ist, gibt jedoch einen Wert ungleich Null zurück, wenn nur der Domänenname angegeben wird. Wann / wo verwende ich die vollständige URL, um die Seite zu erhalten, die ich herunterladen möchte?Aktualisierte Antwort für April 2020:
Ich habe in letzter Zeit viel Erfolg mit cpp-httplib (sowohl als Client als auch als Server) gehabt . Es ist ausgereift und sein ungefährer Single-Threaded-RPS liegt bei 6k.
Auf dem neuesten Stand gibt es ein wirklich vielversprechendes Framework, das cpv-Framework , das auf zwei Kernen etwa 180.000 RPS erreichen kann (und sich gut mit der Anzahl der Kerne skalieren lässt , da es auf dem Seastar- Framework basiert , das die schnellsten DBs antreibt der Planet, Scylladb ).
Das cpv-Framework ist jedoch noch relativ unausgereift. Daher empfehle ich für die meisten Anwendungen cpp-httplib.
Diese Empfehlung ersetzt meine vorherige Antwort (vor 8 Jahren).
quelle
C und C ++ haben keine Standardbibliothek für HTTP oder Socket-Verbindungen. Im Laufe der Jahre wurden einige tragbare Bibliotheken entwickelt. Am weitesten verbreitet ist, wie andere gesagt haben, libcurl .
Hier ist eine Liste von Alternativen zu libcurl (von der libcurl-Website).
Für Linux ist dies auch ein einfacher HTTP-Client. Sie könnten Ihren eigenen einfachen HTTP-GET-Client implementieren, dies funktioniert jedoch nicht, wenn Authentifizierung oder Weiterleitungen erforderlich sind oder wenn Sie hinter einem Proxy arbeiten müssen. Für diese Fälle benötigen Sie eine vollständige Bibliothek wie libcurl.
Für Quellcode mit libcurl kommt dies dem am nächsten, was Sie wollen (Libcurl hat viele Beispiele ). Schauen Sie sich die Hauptfunktion an. Der HTML-Inhalt wird nach einer erfolgreichen Verbindung in den Puffer kopiert. Ersetzen Sie einfach parseHtml durch Ihre eigene Funktion.
quelle
Sie können die embeddedRest- Bibliothek verwenden. Es ist eine leichte Nur-Header-Bibliothek. Es ist also einfach, es in Ihr Projekt aufzunehmen, und es erfordert keine Kompilierung, da keine
.cpp
Dateien darin enthalten sind.Beispiel
readme.md
von repo anfordern :quelle
netdb.h
usw. Ich hätte gerne Hilfe, ja#ifdef _WIN32
hinzuzufügen und dort Windows-spezifischen Code hinzuzufügen. Schauen Sie hier - es gibt keinen großen Unterschied zwischen Unix-Sockets und Windows-Sockets. Ich sehe zwei Hauptunterschiede: 1)WSAStartup
zuerst anrufen und 2)closesocket
anstelle vonclose
Das HTTP-Protokoll ist sehr einfach, daher ist es sehr einfach, einen HTTP-Client zu schreiben. Hier ist eine
https://github.com/pedro-vicente/lib_netsockets
Es verwendet HTTP GET, um eine Datei von einem Webserver abzurufen. Sowohl Server als auch Datei sind Befehlszeilenparameter. Die entfernte Datei wird in einer lokalen Kopie gespeichert.
Haftungsausschluss: Ich bin der Autor
BEARBEITEN: URL bearbeitet
quelle
Beachten Sie, dass hierfür libcurl, Windows.h oder WinSock nicht erforderlich sind! Keine Kompilierung von Bibliotheken, keine Projektkonfiguration usw. Ich habe diesen Code in Visual Studio 2017 c ++ unter Windows 10:
Ich habe gerade herausgefunden, wie das geht, da ich ein einfaches API-Zugriffsskript wollte. Bibliotheken wie libcurl verursachten mir alle möglichen Probleme (selbst wenn ich den Anweisungen folgte ...), und WinSock ist einfach zu niedrig und kompliziert .
Ich bin mir nicht ganz sicher, ob der gesamte IStream-Lesecode (insbesondere die while-Bedingung - Sie können ihn gerne korrigieren / verbessern), aber hey, es funktioniert , problemlos! (Es macht für mich Sinn, dass dies in Ordnung ist , da ich einen blockierenden (synchronen) Aufruf verwendet habe. Das
bytesRead
wäre immer> 0U, bis der Stream ( ISequentialStream ?) Gelesen ist, aber wer weiß.)Siehe auch: Referenz zu URL-Monikern und asynchronen steckbaren Protokollen
quelle
Hier ist ein (relativ) einfacher C ++ 11-Code, der libCURL verwendet, um den Inhalt einer URL in Folgendes herunterzuladen
std::vector<char>
:http_download.hh
http_download.cc
quelle
Im Allgemeinen würde ich etwas plattformübergreifendes wie cURL, POCO oder Qt empfehlen. Hier ist jedoch ein Windows-Beispiel!:
quelle
Wenn Sie nach einer HTTP-Clientbibliothek in C ++ suchen, die auf mehreren Plattformen (Linux, Windows und Mac) unterstützt wird, um Restful-Webdienste zu nutzen. Sie können unten Optionen haben.
quelle
Obwohl etwas spät. Möglicherweise bevorzugen Sie https://github.com/Taymindis/backcurl .
Sie können damit http-Aufrufe für die mobile C ++ - Entwicklung ausführen. Geeignet für die Entwicklung mobiler Spiele
quelle
Sie können dazu ACE verwenden:
quelle