- 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的url15 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都需要一个对应的cleanup30 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 }