libcurl 下載地址: http://curl.haxx.se/download.html
libcurl api 參考文檔: http://curl.haxx.se/libcurl/c/
先介紹一下大體流程, 然後再用代碼示例進行具體使用的演示
libcurl初始化工作:
CURLcode curl_global_init(long flags );
flags的值一般設置爲CURL_GLOBAL_DEFAULT
注意這個函數不是線程安全的, 意味着如果你在編寫一個多線程程序, 你需要在創建你的多線程之前調用它
CURL *curl_easy_init( );
libcurl的初始化函數, 我們通過這個函數獲取libcurl的句柄
CURLcode curl_easy_setopt(CURL
*handle, CURLoption option, parameter);
設置url的一些參數, 例如url的地址, post get請求方式等
CURLcode
curl_easy_perform(CURL * easy_handle );
執行前面設置的這次請求
void
curl_easy_cleanup(CURL * handle );
curl_global_cleanup();
清理工作, 最後調用
示例代碼:
初始化libcurl
CURL* curl_test_init()
{
CURLcode cd = curl_global_init(CURL_GLOBAL_DEFAULT);
if(cd != CURLE_OK)
return 0;
return curl_easy_init();
}
設置http get請求:
CURLcode curl_test_get(CURL* curl, NET_OPT& nopt)
{
CURLcode cd = curl_easy_setopt(curl, CURLOPT_URL, nopt.strUrl.c_str());
if(cd != CURLE_OK)
return cd;
cd = curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L);
if(cd != CURLE_OK)
return cd;
cd = curl_easy_setopt(curl, CURLOPT_WRITEDATA, &nopt.text);
if(cd != CURLE_OK)
return cd;
cd = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_get_callback);
if(cd != CURLE_OK)
return cd;
return CURLE_OK;
}
CURLcode cd = curl_easy_setopt(curl, CURLOPT_URL, nopt.strUrl.c_str()):這段代碼是設置http 的url, 參數之間使用&分隔
cd = curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L):這段設置是告訴我們用的是get請求方式
cd = curl_easy_setopt(curl, CURLOPT_WRITEDATA, &nopt.text),
cd = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_get_callback):處理請求接受到的數據, nopt.text是一個std::string類型的變量, 用於接收返回的文本,write_get_callback是一個處理接收數據的回調函數.
這倆個函數的原型分別爲:
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WRITEDATA, void *pointer);
和
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WRITEFUNCTION, write_callback);
回調函數寫法:size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata);
我的回調函數示例代碼:
size_t write_get_callback(char *ptr, size_t size, size_t nmemb, void *userdata)
{
string str;
str.append(ptr, size*nmemb);
string strGBK = UTF8ToGBK(str);
string* p = (string*)userdata;
Json::Value root;
Json::Reader reader;
if(reader.parse(strGBK.c_str(), root))
{
*p = root["text"].asString();
}
return size*nmemb;
}
把接收到的utf8字符串轉成gbk格式, 然後把讀取到的文本信息存儲到nopt.text中, nopt.text會作爲userdata參數傳遞給回調函數。
執行請求:
CURLcode curl_test_perform(CURL* curl)
{
return curl_easy_perform(curl);
}
清理:
void curl_test_clean(CURL* curl)
{
if(curl)
{
curl_easy_cleanup(curl);
curl_global_cleanup();
}
}
這個示例是使用圖鈴機器人接口所做的一個智能聊天程序, 完整的示例代碼地址:
http://download.csdn.net/detail/shuaixingrumo/9415317
你需要替換自己在圖靈機器人官網申請的key和自己的id才能正常編譯使用這個程序。