Запрос 'GET' на C ++ или как вы загружаете файлы для работы на C ++?

StackOverflow https://stackoverflow.com/questions/419344

Вопрос

Хорошо, я потратил добрых три дня, пытаясь это сделать, вот сценарий:

Я хочу загрузить файл '.csv' из Google, а затем что-то сделать с данными из файла.Это для консольного приложения Win32.У меня отключено последнее, я просто ни за что на свете не смогу понять, как загрузить файл.Я слышал о libcurl, curlpp, ptypes, создавал свои собственные, просто используя .NET api, и мне много раз говорили об этом:

... это просто запрос на ПОЛУЧЕНИЕ

Что ж, все это хорошо, но я, должно быть, чего-то не понимаю, потому что кажется, что все просто родились, зная, как это сделать.Я просматривал книги, пытаясь разобраться в этом, и даже столкнулся с огромной проблемой с LNKerrors после того, как некоторое время изучал "Искусство C ++".

При всем при этом я многому научился из этого, но на данный момент я просто хочу знать, как это сделать.API для C ++ серьезно отсутствует, примеров кода найти невозможно.Учебных пособий в Интернете практически не существует.И ни в одной книге, похоже, не говорится, что это важно.

Кто-нибудь, пожалуйста, может бросить мне спасательный плот?Здесь я человек на грани срыва.

Редактировать

Под "из Google" я подразумеваю, что хочу загрузить csv-файл, который они размещают.Примером может быть найден здесь.

Это было полезно?

Решение

Вы должны быть в состоянии согни это по твоей воле.

Теперь, когда я вроде как ответил на ваш вопрос.Почему именно C ++?Ничего не имею против языка, но выберите лучший язык для работы.Perl, PHP и Python (и, я уверен, больше) имеют отличную документацию и поддержку по такого рода операциям.

В perl (том, с которым я знаком) это всего лишь около 3-5 строк кода.

Другие советы

Почему бы просто не использовать то, что уже есть?

URLDownloadToFile() URLDownloadToFile()

Поскольку вы работаете на платформе Win32, существует встроенная библиотека, которую вы можете использовать для реализации запроса GET в относительно простой способ:WinInet, который является частью Win32 SDK.Тот самый базовый справочник по WinInet можно найти на MSDN.

Имейте в виду, что вам придется нелегко, если вы не знакомы с Win32 API.Существует довольно полезный блок примера кода здесь

Вы получите ошибки компоновщика, если вам не удастся добавить соответствующую ссылку на библиотеку в свой проект.Похоже, вы уже усвоили там некоторые уроки, поэтому я оставлю это вкратце, но будьте уверены, что вы найдете ссылки как на библиотеки, так и на заголовочные файлы, которые вам понадобятся в документации Win32 (вам просто нужно узнать, где на странице это искать).

Вы не можете сделать этого со стандартной библиотекой.Поскольку это win32, вы можете последовать совету Пола Кейстера.

Но взгляните на libcurl, и поскольку вы работаете на C ++, я бы порекомендовал POCO это тоже очень полезно.Это очень удобные инструменты!

Другим вариантом является WinHTTP, который также поставляется вместе с Windows.

> пример кода не найден

???

За 15 лет были опубликованы десятки образцов..Смотрите в новостях api ng://comp.os.ms-windows.programmer.win32 (примеры на C)

(COM, INET и т.д.)

Я тоже искал хорошую http-библиотеку для C ++, но не нашел "идеальной" библиотеки. Boost.Asio это фантастический, но довольно низкий уровень для простой http-библиотеки (хотя примеры http-клиентов являются хорошим началом).Тот самый Сетевая библиотека C ++* (cpp-netlib) похоже, что он находится на верном пути, создавая API более высокого уровня поверх asio, но не очень зрелый.Посмотрите на пример http_client.

Я либо собираюсь написать свои собственные обертки вокруг asio, либо расширить (и внести свой вклад) cpp-netlib, если не смогу найти вариант получше.

(Кстати, libcurl - это не для меня это лучший вариант.Это гораздо больший API, чем я хочу, и очень громоздкий для чего-то вроде http-клиента, особенно в C ++.Не поймите меня неправильно, это отличная библиотека, но она не подходит для простого http-клиента.)

На самом деле в C ++ нет API как такового.Чтобы выполнить запрос GET, вашей программе необходимо открыть соединение с сокетом TCP к соответствующему сайту и отправить информацию по сокету в соответствии со спецификацией HTTP, см. здесь.Вероятно, есть несколько библиотек, которые вы могли бы найти, чтобы помочь с этим, например, вы могли бы посмотреть, что использует программа с открытым исходным кодом wget.Если вы кодируете его самостоятельно, было бы полезно использовать инструмент поиска пакетов.Вы могли бы точно увидеть, что ваш браузер отправляет на веб-сервер, чтобы получить файл обратно, и просто отправить именно это сообщение.Это не слишком сложно, но довольно сложно.Изначально TCP - это довольно большая кривая обучения.

Кстати, что вы подразумеваете под "из Google"?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top