純C/C++ 用 libcurl 撰寫 HTTP 存取程式(Windows)
純C/C++ 用 libcurl 撰寫 HTTP 存取程式(Windows)
資料來源:http://darkranger.no-ip.org/archives/v5/document/develop/libcurl_tutorial.htm
在 Dev-C++ 開發環境使用 libcurl 函式庫
流程如下:
(1) 首先在 cURL 的官方網站下載 Win32 – Generic(2000/XP)的 libcurl 套件,由於要存取的 Yahoo! 奇摩字典網站並沒有使用 SSL(HTTPS),所以可以選擇不支援 SSL 的版本。
(2) 檔案下載後解開來,將 include 和 lib 目錄裡的所有東西分別丟到 Dev-C++ 的 include 和 lib目錄裡。
(3) 將 lib目錄中的 libcurl-4.dll 先複製一份到你所要存放 Project 的目錄。
(4) 啟動 Dev-C++ 並新增 Project,然後在 Dev-C++ 的選單:Project→Project Options→Parameters→Linker 中加入 -lcurl
(5) 最後在程式碼中加入標頭檔即可:
#include <curl/curl.h>
Yahoo! 奇摩字典的資料傳送分析
在開始進行程式碼撰寫之前,必須先瞭解要傳送什麼資料給網站,才能接受到正確的結果。所以請先至 Yahoo! 奇摩字典瞭解一下它是怎麼運作的,可以先試著打一個單字,比方說:unix,然後按下『搜尋』,這時候網址列就會跑出以下結果:
http://tw.dictionary.yahoo.com/search?ei=UTF-8&p=unix
從網址列可以得知:負責字典搜尋的函式是『search』,而傳送的的資料名稱是『ei』和『p』。看樣子 ei 的值應該是固定的,也就是 UTF-8,而 p 值就是欲查詢的單字了,你也可以把網址列的結果和網頁的原始碼對照確認一下。
瞭解其資料傳送的方式後,就可以進行程式碼的撰寫了。
程式碼的撰寫
首先宣告 CURL 變數並啟動 session:
CURL *curl;
curl = curl_easy_init();
然後設定 URL:
curl_easy_setopt(curl, CURLOPT_URL, “tw.dictionary.yahoo.com/search”);
向 URL 傳送資料,假設要搜尋「BSD」這個字:
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, ei=UTF-8&p=BSD);
接收回應資料,也就是搜尋結果:
curl_easy_perform(curl);
最後別忘了把 session 關閉:
curl_easy_cleanup(curl);
完整程式碼範例
以下是完整的程式碼,可以順利編譯與使用:
#include <stdio.h>
#include <stdlib.h>
#include <curl/curl.h>
int main(int argc, char *argv[])
{
char POST[255] = “” ;
CURL *curl;
CURLcode res;
curl = curl_easy_init();
sprintf(POST,”ei=UTF-8&p=%s”,argv[1]);
curl_easy_setopt(curl, CURLOPT_URL, “tw.dictionary.yahoo.com/search”);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, POST);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
return 0;
}
執行測試
將以上的完整程式碼編譯好後,假設檔名為 curl-test.exe,欲搜尋的單字為 blizzard,只要執行以下指令:
curl-test.exe blizzard > result.html
再把 result.html 打開來就可看到單字的查詢結果了。
注意:請記得將 libcurl-4.dll 和執行檔放在同個目錄下,否則會無法執行。
結語
libcurl 為通訊協定的程式撰寫提供了一個跨平台且更為簡易的方案,有需要的開發者可以多多注意一下。
官方網站(以及套件裡)有許多的文件與參考範例。