2009-01-07 14 views
2

好吧我已經花了好三天試試這個,這裏是場景:C++'GET'請求或如何下載文件以在C++中使用?

我想下載谷歌的'.csv'文件,然後用文件中的數據做些什麼。它適用於Win32控制檯應用程序。我有後者,我只是不能爲我的生活弄清楚如何下載文件。我聽說過的libcurl,curlpp,ptypes,我自己的滾動,只需使用.NET API,並且被告知一束時間:

...它只是一個GET請求

那麼這一切都很好,但我必須錯過一些東西,因爲看起來每個人都是在出生時才知道如何做到這一點。我一直在梳理想要弄清楚的書籍,甚至在與「The C++的藝術」一起旅行之後,對LNKerrors有一個很大的問題。

說了這麼多,我已經從中學到了很多東西,但是現在我只想知道如何去做。 C++的API嚴重缺乏,沒有找到示例代碼。在線教程幾乎不存在。在那裏沒有書似乎認爲這很重要。

有人可以扔我救生筏嗎?我是一個在這邊的人。

編輯

通過「谷歌從」我的意思是我想下載一個.csv文件,他們的主機。一個例子可以是found here.

回答

2

您應該可以按照您的意願bend this

現在我已經有點回答你的問題了。爲什麼選擇C++?沒有什麼違背語言,但選擇最適合的工作語言。 Perl,PHP和Python(以及我相信更多)在這類操作上都有很好的文檔和支持。

在perl(我所熟悉的那個)中,只有大約3-5行代碼。

+0

我認爲答案是在「然後做文件中的數據的東西」。似乎很愚蠢的是涉及另一個過程,尤其是如果這需要很快。 – 2009-01-07 06:26:26

+0

Jesse - 看起來花費額外五分鐘的時間下載文件,比如說一個libcurl命令行,而不是花費三天以上的時間根本沒有獲取文件,這似乎並不是那麼愚蠢! – 2009-01-07 08:32:07

0

C++本身並沒有真正的API。要執行GET請求,您的程序需要打開一個到該站點的TCP套接字連接,並將信息向下發送到套接字以符合HTTP規範,請參閱here。可能有很多庫可以幫助您實現這一點,例如,您可以查看wget使用的開放源代碼程序。如果您自己編寫代碼,使用數據包嗅探工具會很有幫助。您可以確切地看到您的瀏覽器向Web服務器發送的文件,然後只發送該消息。這並不難,但它很難。 TCP最初是一個相當大的學習曲線。

順便說一下,您的意思是「來自谷歌?」

1

因爲你在Win32平臺上,所以你可以使用一個內建的libary來實現一個簡單的相對的GET請求:WinInet,它是Win32 SDK的一部分。可以在MSDN上找到basic reference for WinInet

被警告如果你不熟悉Win32 API,會有一些粗糙的雪橇。有一個相當有用的示例代碼塊here

如果您未能將相應的庫引用添加到項目中,將會出現鏈接器錯誤。這聽起來像你已經在那裏學到了一些教訓,所以我會保持它的簡潔,但請放心,你會找到在Win32文檔中需要的庫和頭文件引用的引用(你只需要知道它在哪裏該頁面來查找它)。

2

爲什麼不只是使用已經存在的東西呢?

UrlDownloadToFile()

+0

我試過這個,並有一些問題,從來沒有真正下載過的文件。此外,如果您看到「LPSCTWR」轉換錯誤,請注意後續使用URLDownloadToFileA(),因爲C++不喜歡您沒有寬字符串。 – 2009-01-07 06:50:59

1

你不能做到這一點與標準庫。既然是win32,你可以按照Paul Keister的建議。

但看看libcurl,既然你在C++,我推薦POCO它也非常有用。他們是非常方便的工具!

1

>沒有示例代碼可尋

???樣品

幾十個已經公佈了15年.. 參見API NG消息://comp.os.ms-windows.programmer.win32 (在C樣品)

(COM,INET,等等)

1

我也一直在尋找一個好的C++的http lib,但還沒有找到'完美'的庫。 Boost.Asio對於一個簡單的http庫來說是很棒的,但水平很低(儘管http client examples是一個好的開始)。 C++ Networking Library*(cpp-netlib)看起來像是正軌,在asio之上構建了一個更高級的api,但並不是非常成熟。查看http_client example

我要麼寫我自己的包裝asio或延長(和貢獻)cpp-netlib,除非我能找到一個更好的選擇。

(BTW libcurl的是對我來說是更好的選擇。這是一個更大的API,比我想和像HTTP客戶端非常笨重,尤其是在C++,不要誤會我的意思,這是一個偉大的圖書館但不適合簡單的http客戶端。)

相關問題