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才能正常编译使用这个程序。