Czy jest jakiś sposób na łatwe wykonanie żądania HTTP w C ++? W szczególności chcę pobrać zawartość strony (API) i sprawdzić zawartość, aby zobaczyć, czy zawiera 1 lub 0. Czy można również pobrać zawartość do łańcucha?
c++
httprequest
Sam152
źródło
źródło
Odpowiedzi:
Miałem ten sam problem. libcurl jest naprawdę kompletny. Istnieje curlpp otoki C ++, który może Cię zainteresować, gdy poprosisz o bibliotekę C ++. neon to kolejna interesująca biblioteka C, która obsługuje również WebDAV .
curlpp wydaje się naturalny, jeśli używasz C ++. W dystrybucji źródłowej podano wiele przykładów. Aby uzyskać treść adresu URL, robisz coś takiego (wyciąg z przykładów):
Zobacz
examples
katalog w dystrybucji źródłowej curlpp , istnieje wiele bardziej skomplikowanych przypadków, a także prosty kompletny minimalny przy użyciu curlpp.moje 2 centy ...
źródło
os << myRequest.perform();
gomyRequest.setOpt( new curlpp::options::WriteStream( &os ) ); myRequest.perform();
dało wyniki. Pamiętaj, aby nie używaćhttp://example.com
, spowoduje to zwrócenie pustej strony. Lepsze wykorzystanie nphttp://www.wikipedia.org
.Kod systemu Windows:
Oto znacznie lepsza implementacja:
źródło
GET / HTTP/1.1.1/... etc
)? Jak dowiedzieć się, jak sformatować to, co wysyłam?Aktualizacja 2020: Mam nową odpowiedź, która zastępuje tę, obecnie 8-letnią, jedną: https://stackoverflow.com/a/61177330/278976
W systemie Linux wypróbowałem cpp-netlib, libcurl, curlpp, urdl, boost :: asio i zastanowiłem się nad Qt (ale odmówiłem na podstawie licencji). Wszystkie z nich były niekompletne do tego zastosowania, miały niechlujne interfejsy, miały słabą dokumentację, były nieobsługiwane lub nie obsługiwały protokołu https.
Następnie, zgodnie z sugestią https://stackoverflow.com/a/1012577/278976 , wypróbowałem POCO. Wow, szkoda, że nie widziałem tego lata temu. Oto przykład tworzenia żądania HTTP GET za pomocą POCO:
https://stackoverflow.com/a/26026828/2817595
POCO jest darmowym, otwartym oprogramowaniem (licencja doładowania). I nie, nie mam żadnych powiązań z firmą; Po prostu bardzo lubię ich interfejsy. Świetna robota chłopaki (i dziewczęta).
https://pocoproject.org/download.html
Mam nadzieję, że to pomoże komuś ... Wypróbowanie wszystkich tych bibliotek zajęło mi trzy dni.
źródło
Opracowywane jest nowsze, mniej dojrzałe opakowanie curl o nazwie C ++ Requests . Oto proste żądanie GET:
Obsługuje wiele różnych czasowników HTTP i opcji zwijania. Jest więcej dokumentacja Wykorzystanie tutaj .
Oświadczenie: Jestem opiekunem tej biblioteki .
źródło
Oto moje minimalne opakowanie wokół cURL, aby móc pobrać stronę internetową jako ciąg znaków. Jest to przydatne na przykład do testowania jednostkowego. Jest to po prostu opakowanie RAII wokół kodu C.
Zainstaluj „libcurl” na swoim komputerze
yum install libcurl libcurl-devel
lub jego odpowiedniku.Przykład użycia:
Implementacja klasy:
źródło
libCURL to całkiem dobra opcja dla Ciebie. W zależności od tego, co musisz zrobić, samouczek powinien powiedzieć ci, czego chcesz, szczególnie dla łatwej obsługi. Ale w zasadzie możesz to zrobić, aby zobaczyć źródło strony:
Wierzę, że spowoduje to wydrukowanie wyniku na standardowe wyjście. Jeśli zamiast tego chcesz to obsłużyć - co, jak zakładam, robisz - musisz ustawić CURL_WRITEFUNCTION. Wszystko to opisano w samouczku curl, do którego link znajduje się powyżej.
źródło
Jak chcesz rozwiązanie C ++, możesz użyć Qt . Ma klasę QHttp, której możesz użyć.
Możesz sprawdzić dokumenty :
Qt ma też o wiele więcej do zaoferowania we wspólnej aplikacji C ++.
źródło
QNetworkAccessManager
jest udokumentowany od wersji Qt 4.4; a w Qt 4.8 mówi:QHttp - This class is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code.
Myślę, że nadal jest dostępny, jeśli zignorujesz przestarzałe ostrzeżenia.Możesz sprawdzić C ++ REST SDK (nazwa kodowa „Casablanca”). http://msdn.microsoft.com/en-us/library/jj950081.aspx
Dzięki zestawowi REST SDK C ++ możesz łatwiej łączyć się z serwerami HTTP z aplikacji C ++.
Przykład użycia:
C ++ REST SDK to projekt firmy Microsoft do opartej na chmurze komunikacji klient-serwer w natywnym kodzie przy użyciu nowoczesnego asynchronicznego interfejsu API C ++.
źródło
Z tą odpowiedzią odnoszę się do odpowiedzi Software_Developer . Po przebudowaniu kodu odkryłem, że niektóre części są przestarzałe (
gethostbyname()
) lub nie zapewniają obsługi błędów (tworzenie gniazd, wysyłanie czegoś) dla operacji.Poniższy kod systemu Windows jest testowany z programem Visual Studio 2013 i Windows 8.1 64-bit, a także Windows 7 64-bit. Będzie celować w połączenie IPv4 TCP z serwerem internetowym www.google.com.
Bibliografia:
Wycofanie gethostbyname
Zwracana wartość gniazda ()
Zwracana wartość send ()
źródło
C ++ nie zapewnia żadnego sposobu, aby to zrobić bezpośrednio. Zależy to całkowicie od posiadanych platform i bibliotek.
W najgorszym przypadku możesz użyć biblioteki boost :: asio do nawiązania połączenia TCP, wysłać nagłówki HTTP (RFC 2616) i bezpośrednio parsować odpowiedzi. Patrząc na twoje potrzeby aplikacji, jest to dość proste do zrobienia.
źródło
Oto kod, który będzie działał bez potrzeby korzystania z żadnej biblioteki innej firmy: Najpierw zdefiniuj bramę, użytkownika, hasło i wszelkie inne parametry, które musisz wysłać na ten konkretny serwer.
Oto sam kod:
To powinno działać w środowisku Win32 API.
Oto przykład .
źródło
InternetConnect
zwraca null, gdy podano pełny adres URL, ale zwraca wartość inną niż null, gdy podana jest tylko nazwa domeny. Więc kiedy / gdzie mam użyć pełnego adresu URL, aby uzyskać stronę, którą chcę pobrać?Zaktualizowana odpowiedź na kwiecień 2020 r .:
Ostatnio odniosłem duży sukces z cpp-httplib (zarówno jako klient, jak i serwer). Jest dojrzały, a jego przybliżony, jednowątkowy RPS wynosi około 6 tys.
Co więcej, istnieje naprawdę obiecująca platforma, cpv-framework , która może uzyskać około 180 000 RPS na dwóch rdzeniach (i dobrze skaluje się z liczbą rdzeni, ponieważ jest oparta na ramie seastar , która zasila najszybsze DB na planeta, scylladb ).
Jednak szkielet cpv jest nadal stosunkowo niedojrzały; więc do większości zastosowań bardzo polecam cpp-httplib.
To zalecenie zastępuje moją poprzednią odpowiedź (8 lat temu).
źródło
C i C ++ nie mają standardowej biblioteki dla HTTP ani nawet dla połączeń gniazd. Z biegiem lat opracowano niektóre biblioteki przenośne. Najpopularniejszym, jak powiedzieli inni, jest libcurl .
Oto lista alternatyw dla libcurl (pochodzących ze strony internetowej libcurl).
Ponadto, dla systemów Linux, to jest to prosty klient HTTP. Możesz wdrożyć własnego prostego klienta HTTP GET, ale to nie zadziała, jeśli w grę wchodzi uwierzytelnianie lub przekierowania albo jeśli potrzebujesz pracy za serwerem proxy. W takich przypadkach potrzebujesz pełnej biblioteki, takiej jak libcurl.
Dla kodu źródłowego z libcurl, to jest najbliżej, co chcesz (libCurl ma wiele przykładów ). Spójrz na główną funkcję. Zawartość html zostanie skopiowana do bufora po udanym połączeniu. Wystarczy zastąpić parseHtml własną funkcją.
źródło
Możesz użyć biblioteki embeddedRest . Jest to lekka biblioteka zawierająca tylko nagłówki. Dlatego łatwo jest dołączyć go do swojego projektu i nie wymaga kompilacji, ponieważ nie ma
.cpp
w nim plików.Poproś o przykład
readme.md
z repozytorium:źródło
netdb.h
itp więc chciałbym jakąś pomoc Tak#ifdef _WIN32
i dodać tam kod specyficzny dla systemu Windows. Spójrz tutaj - nie ma dużej różnicy między gniazdami unixowymi a gniazdami Windows. Widzę dwie główne różnice: 1)WSAStartup
najpierw zadzwoń i 2) użyjclosesocket
zamiastclose
Protokół HTTP jest bardzo prosty, więc napisanie klienta HTTP jest bardzo proste. Tutaj jest jeden
https://github.com/pedro-vicente/lib_netsockets
Używa HTTP GET, aby pobrać plik z serwera WWW, zarówno serwer, jak i plik są parametrami wiersza poleceń. Plik zdalny jest zapisywany w lokalnej kopii.
Oświadczenie: Jestem autorem
EDYCJA: edytowany adres URL
źródło
Pamiętaj, że nie wymaga to libcurl, Windows.h ani WinSock! Brak kompilacji bibliotek, brak konfiguracji projektu itp. Mam ten kod działający w Visual Studio 2017 c ++ na Windows 10:
Właśnie wymyśliłem, jak to zrobić, ponieważ chciałem prostego skryptu dostępu do interfejsu API, biblioteki takie jak libcurl sprawiały mi wiele problemów (nawet gdy postępowałem zgodnie z instrukcjami ...), a WinSock jest po prostu zbyt niski i skomplikowany .
Nie jestem pewien co do całego kodu czytającego IStream (szczególnie warunek while - możesz go poprawić / poprawić), ale hej, to działa , bezproblemowo! (Ma dla mnie sens, że skoro użyłem wywołania blokującego (synchronicznego) , jest w porządku,
bytesRead
zawsze będzie to> 0U, dopóki strumień ( ISequentialStream ?) Nie zostanie odczytany, ale kto wie.)Zobacz także: Monikery URL i odwołanie do protokołu asynchronicznego protokołu wtykowego
źródło
Oto niektóre (względnie) prosty kod C ++ 11, który używa libCURL do pobierania zawartości adresu URL do
std::vector<char>
:http_download.hh
http_download.cc
źródło
Ogólnie polecam coś międzyplatformowego, jak cURL, POCO lub Qt. Oto przykład systemu Windows !:
źródło
Jeśli szukasz biblioteki klienta HTTP w C ++ obsługiwanej na wielu platformach (Linux, Windows i Mac) do korzystania z usług sieciowych Restful. Możesz mieć poniższe opcje.
źródło
Chociaż trochę późno. Możesz preferować https://github.com/Taymindis/backcurl .
Pozwala na wykonywanie połączeń http w programowaniu mobilnym c ++. Nadaje się do tworzenia gier mobilnych
źródło
Możesz użyć ACE, aby to zrobić:
źródło