libcurl使用1:用get請求方式+圖靈機器人接口實現智能聊天系統

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才能正常編譯使用這個程序。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章