Как Вы делаете Запрос HTTP с C++?

Просто: вы не можете использовать this в инициализаторах. Идея состоит в том, чтобы предотвратить выход незавершенного объекта - Nested(this) может сделать что-нибудь с вашим объектом, что приведет к очень запутанным и трудным для понимания ошибкам. Помните, что инициализаторы выполняют перед любым конструктором, который вы добавляете. То же самое не работает и для инициализаторов полей, точно так же:

private Nested _field = new Nested(this);

По сути, инициализаторы предназначены для выполнения простых инициализаций - исправления проблемы 98%. Все, что связано с this, является более сложным, и вам нужно написать свой собственный конструктор - и взять на себя вину за любые проблемы синхронизации:)

238
задан Patrick Hofman 3 January 2015 в 06:27
поделиться

5 ответов

У меня была такая же проблема. libcurl действительно завершена. Существует оболочка C ++ curlpp , которая может вас заинтересовать, когда вы просите библиотеку C ++. neon - еще одна интересная библиотека C, которая также поддерживает WebDAV .

curlpp кажется естественным, если вы используете C ++. В исходном коде есть много примеров. Чтобы получить содержимое URL-адреса, вы делаете что-то вроде этого (извлечено из примеров):

// Edit : rewritten for cURLpp 0.7.3
// Note : namespace changed, was cURLpp in 0.7.2 ...

#include <curlpp/cURLpp.hpp>
#include <curlpp/Options.hpp>

// RAII cleanup

curlpp::Cleanup myCleanup;

// Send request and get a result.
// Here I use a shortcut to get it in a string stream ...

std::ostringstream os;
os << curlpp::options::Url(std::string("http://www.wikipedia.org"));

string asAskedInQuestion = os.str();

См. Каталог examples в исходном дистрибутиве curlpp , есть много более сложных случаев , а также простой полный минимальный с использованием curlpp.

мои 2 цента ...

229
ответ дан 23 November 2019 в 03:22
поделиться

C ++ не предоставляет никакого способа сделать это напрямую. Это будет полностью зависеть от того, какие платформы и библиотеки у вас есть.

В худшем случае вы можете использовать библиотеку boost :: asio для установления TCP-соединения, отправки HTTP-заголовков (RFC 2616) и непосредственного анализа ответов. Глядя на потребности вашего приложения, сделать это достаточно просто.

7
ответ дан 23 November 2019 в 03:22
поделиться

libCURL - очень хороший вариант для вас. В зависимости от того, что вам нужно сделать, учебное пособие должно сказать вам, что вы хотите, в частности, о простой ручке. Но, по сути, вы можете сделать это, просто чтобы увидеть источник страницы:

CURL* c;
c = curl_easy_init();
curl_easy_setopt( c, CURL_URL, "www.google.com" );
curl_easy_perform( c );
curl_easy_cleanup( c );

Я считаю, что это приведет к тому, что результат будет напечатан в stdout. Если вы хотите справиться с этим вместо этого - что, я полагаю, у вас есть - вам нужно установить CURL_WRITEFUNCTION. Все это описано в приведенном выше руководстве по curl.

16
ответ дан 23 November 2019 в 03:22
поделиться

Если вам нужно решение на C ++, вы можете использовать Qt . У него есть класс QHttp, который вы можете использовать.

Вы можете проверить docs :

http->setHost("qt.nokia.com");
http->get(QUrl::toPercentEncoding("/index.html"));

Qt также имеет гораздо больше возможностей, которые вы могли бы использовать в обычном приложении C ++.

16
ответ дан 23 November 2019 в 03:22
поделиться

C и C ++ не имеют стандартной библиотеки для HTTP или даже для соединений с сокетами. За прошедшие годы было разработано несколько переносимых библиотек. Как уже говорили другие, наиболее широко используется libcurl .

Вот список альтернатив libcurl (взятый с веб-сайта libcurl).

Также, для Linux это простой HTTP-клиент. Вы можете реализовать свой собственный простой HTTP-клиент GET, но это не сработает, если задействованы аутентификация или перенаправления, или если вам нужно работать через прокси. Для этих случаев вам понадобится полноценная библиотека, например libcurl.

Для исходного кода с libcurl, это наиболее близко к тому, что вам нужно (Libcurl имеет много примеров ). Посмотрите на основную функцию. Содержимое html будет скопировано в буфер после успешного подключения. Просто замените parseHtml своей собственной функцией.

3
ответ дан 23 November 2019 в 03:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: