• curl在linux下很好用,但到了windows下写程序却没办法使用了,这时候可以使用libcurl库
  • libcurl库的编译网上很多,我就不一一赘述了,curl的官方网站:https://curl.haxx.se/,下载下来根据README编译即可
  • 在使用libcurl的程序中,首先需要初始化libcurl的全局环境,意味着无论你要执行多少次的传输,都应该且只初始化一次:
1 curl_global_init(CURL_GLOBAL_ALL);//该语句是全局初始化,在程序中只需要执行一次,而且初始化与释放配套,即初始化之后环境,在程序结束的时候需要清除该环境
2 curl_global_cleanup();//该函数用来释放掉初始化的全局环境
注意:请避免重复的调用curl_global_init和 curl_global_cleanup,他们每个仅被调用一次。
  • 全局初始化函数需要一个参数:
    • CURL_GLOBAL_ALL:表示初始化所有已知的内部子模块,一般都是使用这个宏
    • CURL_GLOBAL_WIN32:只被应用在windows系统上,初始化win32套接字
    • CURL_GLOBAL_SSL:初始化与ssl相关的环境
    • CURL_GLOBAL_NOTHING:没有额外的初始化
  • 在初始化全局环境之后,就可以使用libcurl了,为了使用libcurl提供的简单借口,需要创建一个简单借口的句柄:
//初始化简单接口的句柄,每一个简单的接口通信都需要一个句柄,也就是说需要为每个准备传输数据的线程都创建一个句柄,句柄不能共享
CURL *curl = curl_easy_init();
//初始化之后需要判空,判断句柄是否初始化成功了
if(curl == NULL){/*打印日志,初始化失败*/}
  • 得到句柄curl之后,可以在这个句柄中设置多个选型
 1  //设置curl的信息
 2  函数原型:CURLcode curl_easy_setopt(CURL *curl, CURLoption option, …);
 3  
 4  //设置防止301,302重定向
 5  curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION,0);
 6 
 7 //当需要对响应的数据进行解析的话,就需要一个回调函数取到返回数据
 8 //string 就是要解析的返回数据
 9 string content;
10 long retcode = 0;//http的返回码,判断响应
11 
12  curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content);
13  curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &process_data);
14  //准备发送request的url
15  curl_easy_setopt(curl, CURLOPT_URL, "url"); 
16  //当发送的url请求是需要验证用户名密码的,也可以将用户名和密码设置到句柄内
17  curl_easy_setopt(curl, CURLOPT_USERPWD, "username:password");
18 
19 //都设置完成之后就可以执行了
20 curl_easy_perform(curl);
21 
22 CURLcode result = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE , &retcode);
23 
24 if ( (result != CURLE_OK) || retcode != 200 ){/*
25     CURLE_OK 代表 curl的错误代码,ok代表成功
26 
27 */}
28 
29 //到这里一个完整的libcurl请求就发送出去了,在结束时还需要将句柄删除掉,就是说每一次init都需要一个对应的cleanup
30 curl_easy_cleanup(curl);
  • 获取返回数据的方法代码如下:
1 static size_t process_data(void *data, size_t size, size_t nmemb, string &content)
2 {
3     long sizes = size * nmemb;
4     string temp;
5     temp = string((char*)data,sizes);
6     content += temp;
7     return sizes;
8 
9 }

 

posted on 2017-03-24 10:05  Daniel_z  阅读(2398)  评论(0编辑  收藏  举报