Запрос 'GET' на C ++ или как вы загружаете файлы для работы на C ++?
-
03-07-2019 - |
Вопрос
Хорошо, я потратил добрых три дня, пытаясь это сделать, вот сценарий:
Я хочу загрузить файл '.csv' из Google, а затем что-то сделать с данными из файла.Это для консольного приложения Win32.У меня отключено последнее, я просто ни за что на свете не смогу понять, как загрузить файл.Я слышал о libcurl, curlpp, ptypes, создавал свои собственные, просто используя .NET api, и мне много раз говорили об этом:
... это просто запрос на ПОЛУЧЕНИЕ
Что ж, все это хорошо, но я, должно быть, чего-то не понимаю, потому что кажется, что все просто родились, зная, как это сделать.Я просматривал книги, пытаясь разобраться в этом, и даже столкнулся с огромной проблемой с LNKerrors после того, как некоторое время изучал "Искусство C ++".
При всем при этом я многому научился из этого, но на данный момент я просто хочу знать, как это сделать.API для C ++ серьезно отсутствует, примеров кода найти невозможно.Учебных пособий в Интернете практически не существует.И ни в одной книге, похоже, не говорится, что это важно.
Кто-нибудь, пожалуйста, может бросить мне спасательный плот?Здесь я человек на грани срыва.
Редактировать
Под "из Google" я подразумеваю, что хочу загрузить csv-файл, который они размещают.Примером может быть найден здесь.
Решение
Вы должны быть в состоянии согни это по твоей воле.
Теперь, когда я вроде как ответил на ваш вопрос.Почему именно C ++?Ничего не имею против языка, но выберите лучший язык для работы.Perl, PHP и Python (и, я уверен, больше) имеют отличную документацию и поддержку по такого рода операциям.
В perl (том, с которым я знаком) это всего лишь около 3-5 строк кода.
Другие советы
Почему бы просто не использовать то, что уже есть?
Поскольку вы работаете на платформе Win32, существует встроенная библиотека, которую вы можете использовать для реализации запроса GET в относительно простой способ:WinInet, который является частью Win32 SDK.Тот самый базовый справочник по WinInet можно найти на MSDN.
Имейте в виду, что вам придется нелегко, если вы не знакомы с Win32 API.Существует довольно полезный блок примера кода здесь
Вы получите ошибки компоновщика, если вам не удастся добавить соответствующую ссылку на библиотеку в свой проект.Похоже, вы уже усвоили там некоторые уроки, поэтому я оставлю это вкратце, но будьте уверены, что вы найдете ссылки как на библиотеки, так и на заголовочные файлы, которые вам понадобятся в документации Win32 (вам просто нужно узнать, где на странице это искать).
Другим вариантом является 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"?