Есть ли способ легко сделать HTTP-запрос с C ++? В частности, я хочу загрузить содержимое страницы (API) и проверить содержимое, чтобы увидеть, содержит ли оно 1 или 0. Можно ли также загрузить содержимое в строку?
c++
httprequest
Sam152
источник
источник
Ответы:
У меня такая же проблема. libcurl действительно завершен. Существует обертка C ++ curlpp, которая может вас заинтересовать, когда вы запрашиваете библиотеку C ++. Neon - еще одна интересная библиотека C, которая также поддерживает WebDAV .
curlpp кажется естественным, если вы используете C ++. В исходном выпуске много примеров. Чтобы получить содержание URL, вы делаете что-то подобное (извлечено из примеров):
Смотрите
examples
каталог в дистрибутиве исходного кода curlpp , есть много более сложных случаев, а также простой полный минимальный случай с использованием curlpp.мои 2 цента ...
источник
os << myRequest.perform();
наmyRequest.setOpt( new curlpp::options::WriteStream( &os ) ); myRequest.perform();
дал результаты. Убедитесь, что не используетеhttp://example.com
, это вернет пустую страницу. Лучше использовать, напримерhttp://www.wikipedia.org
.Код Windows:
Вот намного лучшая реализация:
источник
GET / HTTP/1.1.1/... etc
)? Как мне узнать, как отформатировать то, что я отправляю?Обновление 2020: у меня есть новый ответ, который заменяет этот, которому сейчас 8 лет, один: https://stackoverflow.com/a/61177330/278976
В Linux я попробовал cpp-netlib, libcurl, curlpp, urdl, boost :: asio и рассмотрел Qt (но отклонил его на основании лицензии). Все они были либо неполными для этого использования, имели небрежные интерфейсы, имели плохую документацию, не обслуживались или не поддерживали https.
Затем, по предложению https://stackoverflow.com/a/1012577/278976 , я попробовал POCO. Ух ты, жаль, что я не видел это много лет назад. Вот пример выполнения HTTP-запроса GET с помощью POCO:
https://stackoverflow.com/a/26026828/2817595
POCO является бесплатным, с открытым исходным кодом (лицензия Boost). И нет, я не имею никакого отношения к компании; Мне просто очень нравятся их интерфейсы. Отличная работа, ребята (и девочки).
https://pocoproject.org/download.html
Надеюсь, это кому-нибудь поможет ... Мне понадобилось три дня, чтобы опробовать все эти библиотеки.
источник
В настоящее время разрабатывается более новая, менее зрелая оболочка curl, которая называется C ++ Requests . Вот простой запрос GET:
Он поддерживает множество HTTP-глаголов и опций curl. Там больше документации использования здесь .
Отказ от ответственности: я хранитель этой библиотеки .
источник
Вот моя минимальная оболочка вокруг cURL, чтобы можно было просто получить веб-страницу в виде строки. Это полезно, например, для модульного тестирования. Это в основном оболочка RAII вокруг кода C.
Установите «libcurl» на свой компьютер
yum install libcurl libcurl-devel
или аналогичный.Пример использования:
Реализация класса:
источник
libCURL - довольно хороший вариант для вас. В зависимости от того, что вам нужно сделать, учебник должен сказать вам, что вы хотите, особенно для удобной работы. Но, в принципе, вы можете сделать это просто, чтобы увидеть источник страницы:
Я считаю, что это приведет к выводу результата на стандартный вывод. Если вы хотите обработать это вместо этого - что, я полагаю, вы делаете - вам нужно установить CURL_WRITEFUNCTION. Все это описано в уроке по скручиванию, указанном выше.
источник
Если вам нужно решение C ++, вы можете использовать Qt . У него есть класс QHttp, который вы можете использовать.
Вы можете проверить документы :
Qt также имеет гораздо больше возможностей, которые вы можете использовать в обычном приложении C ++.
источник
QNetworkAccessManager
был задокументирован с Qt 4.4; и в Qt 4.8 говорится:QHttp - This class is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code.
Так что я думаю, что он все еще доступен, если вы игнорируете устаревшие предупреждения.Вы можете проверить C ++ REST SDK (кодовое название "Касабланка"). http://msdn.microsoft.com/en-us/library/jj950081.aspx
С помощью C ++ REST SDK вы можете легче подключаться к HTTP-серверам из своего приложения C ++.
Пример использования:
C ++ REST SDK - это проект Microsoft для облачной связи клиент-сервер в собственном коде с использованием современного асинхронного C ++ API.
источник
С этим ответом я ссылаюсь на ответ от Software_Developer . Перестраивая код, я обнаружил, что некоторые части устарели (
gethostbyname()
) или не обеспечивают обработку ошибок (создание сокетов, отправку чего-либо) для операции.Следующий код Windows протестирован с 64-битной Visual Studio 2013 и Windows 8.1, а также с 64-битной Windows 7. Он будет нацелен на TCP-соединение IPv4 с веб-сервером www.google.com.
Ссылки:
Устаревание gethostbyname
Возвращаемое значение сокета ()
Возвращаемое значение send ()
источник
C ++ не предоставляет никакого способа сделать это напрямую. Это будет полностью зависеть от того, какие платформы и библиотеки у вас есть.
В худшем случае вы можете использовать библиотеку boost :: asio для установления TCP-соединения, отправки заголовков HTTP (RFC 2616) и непосредственного анализа ответов. Глядя на потребности вашего приложения, это достаточно просто сделать.
источник
Вот некоторый код, который будет работать без необходимости использования какой-либо сторонней библиотеки: сначала определите свой шлюз, пользователя, пароль и любые другие параметры, которые вам нужно отправить на этот конкретный сервер.
Вот сам код:
Это должно работать в среде Win32 API.
Вот пример .
источник
InternetConnect
возвращает нулевое значение, когда указан полный URL-адрес, но возвращает ненулевое значение, если указано только доменное имя. Так, когда / где я могу использовать полный URL, чтобы получить страницу, которую я хочу загрузить?Обновленный ответ за апрель 2020 года:
Недавно у меня был большой успех с cpp-httplib (как клиентом, так и сервером). Это зрелый и его приблизительный, однопоточный RPS составляет около 6 КБ.
Более того, есть действительно многообещающая инфраструктура, cpv-framework , которая может получить около 180 тыс. RPS на двух ядрах (и будет хорошо масштабироваться с количеством ядер, потому что она основана на инфраструктуре Seastar , которая обеспечивает работу самых быстрых БД на планета, scylladb ).
Однако, cpv-framework все еще относительно незрелый; поэтому для большинства случаев я настоятельно рекомендую cpp-httplib.
Эта рекомендация заменяет мой предыдущий ответ (8 лет назад).
источник
C и C ++ не имеют стандартной библиотеки для HTTP или даже для сокетных соединений. За эти годы были разработаны некоторые портативные библиотеки. Как уже говорили другие, наиболее широко используемым является libcurl .
Вот список альтернатив libcurl (с веб-сайта libcurl).
Также для Linux это простой HTTP-клиент. Вы можете реализовать свой собственный простой HTTP-клиент GET, но это не сработает, если задействованы аутентификация или перенаправления, или если вам нужно работать за прокси-сервером. Для этих случаев вам нужна полноценная библиотека, такая как libcurl.
Для исходного кода с libcurl это наиболее близко к тому, что вы хотите (у Libcurl есть много примеров ). Посмотрите на основную функцию. Содержание html будет скопировано в буфер после успешного подключения. Просто замените parseHtml своей собственной функцией.
источник
Вы можете использовать встроенную библиотеку. Это легкая библиотека только для заголовков. Поэтому его легко включить в ваш проект, и он не требует компиляции, потому что в нем нет
.cpp
файлов.Пример запроса
readme.md
из репо:источник
netdb.h
т.д., поэтому мне#ifdef _WIN32
и добавить туда специфичный для Windows код. Посмотрите здесь - нет большой разницы между сокетами Unix и Windows. Я вижу два основных различия: 1) позвониWSAStartup
первым и 2) используйclosesocket
вместоclose
Протокол HTTP очень прост, поэтому написать клиент HTTP очень просто. Вот один
https://github.com/pedro-vicente/lib_netsockets
Он использует HTTP GET для извлечения файла с веб-сервера, и сервер, и файл являются параметрами командной строки. Удаленный файл сохраняется в локальной копии.
Отказ от ответственности: я автор
РЕДАКТИРОВАТЬ: отредактированный URL
источник
Обратите внимание, что для этого не требуется libcurl, Windows.h или WinSock! Нет компиляции библиотек, нет конфигурации проекта и т. Д. У меня есть этот код работает в Visual Studio 2017 c ++ на Windows 10:
Я только что понял, как это сделать, так как я хотел простой скрипт доступа к API, библиотеки, такие как libcurl, вызывали у меня всевозможные проблемы (даже когда я следовал инструкциям ...), а WinSock слишком низкоуровневый и сложный ,
Я не совсем уверен во всем коде чтения IStream (особенно в условиях while - не стесняйтесь исправлять / улучшать), но эй, это работает , без проблем! (Для меня имеет смысл, что, поскольку я использовал блокирующий (синхронный) вызов , это нормально, это
bytesRead
всегда будет> 0U, пока поток ( ISequentialStream ?) Не закончит чтение, но кто знает.)См. Также: URL Monikers и Asynchronous Pluggable Protocol Справочник
источник
Вот некоторый (относительно) простой код C ++ 11, который использует libCURL для загрузки содержимого URL в
std::vector<char>
:http_download.hh
http_download.cc
источник
Обычно я рекомендую что-нибудь кроссплатформенное, например, cURL, POCO или Qt. Тем не менее, вот пример Windows!
источник
Если вы ищете клиентскую библиотеку HTTP на C ++, которая поддерживается на нескольких платформах (Linux, Windows и Mac) для использования веб-служб Restful. Вы можете иметь ниже варианты.
источник
Хотя немного поздно. Вы можете предпочесть https://github.com/Taymindis/backcurl .
Это позволяет вам выполнять http-вызов для разработки мобильных c ++. Подходит для разработки мобильных игр
источник
Вы можете использовать ACE для этого:
источник