Запрос GET на C ++ или как вы загружаете файлы для работы в C ++? - PullRequest
2 голосов
/ 07 января 2009

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

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

... это просто запрос GET

Ну, это все хорошо, но я должен что-то упустить, потому что кажется, что все просто родились, зная, как это сделать. Я перебирал книги, пытаясь понять это, и даже испытывал огромные проблемы с LNKerrors после того, как некоторое время путешествовал с «The Art of C ++».

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

Может кто-нибудь, пожалуйста, выбросить мне спасательный плот? Я человек на краю здесь.

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

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

Ответы [ 8 ]

2 голосов
/ 07 января 2009

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

UrlDownloadToFile ()

2 голосов
/ 07 января 2009

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

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

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

1 голос
/ 08 января 2009

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

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

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

1 голос
/ 07 января 2009

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

???

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

(COM, INET и т. Д.)

1 голос
/ 07 января 2009

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

1 голос
/ 07 января 2009

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

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

1 голос
/ 07 января 2009

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

Имейте в виду, что если вы не знакомы с API-интерфейсом Win32, впереди вас ждут тяжелые упряжки. Здесь есть довольно полезный блок примера кода

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

0 голосов
/ 07 января 2009

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

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

...