libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。
Libcurl下载地址链接(我用的是7_71_1版本):
https://github.com/curl/curl/releases/tag/curl-7_71_1
openssl安装包下载地址(我选择了Win64OpenSSL-3_0_5.msi这个版本):
http://slproweb.com/products/Win32OpenSSL.html
1.解压完libcurl后进入到 curl-7.71.1\projects\Windows\VC10\lib 下,用vs2010打开libcurl.sln
2.选择DLL Release 和 X64
3.拷贝OpenSSL的头文件和库文件
3.1.先将OpenSSL-Win64\include\ 下的openssl拷贝到curl-7.71.1的同级目录,如下:
3.2.OpenSSL-Win64\lib 下,找到libcrypto.lib 和 libssl.lib ,拷贝到curl-7.71.1\projects\Windows\VC10\lib下。(注意:网上说的Openssl的libeay32.dll和ssleay32.dll,其实是在在1.0.x之前的版本中,在之后的版本中使用的是libssl.dll和libcrypto.dll)
4.项目属性设置
4.1.设置附加包含目录
4.2.设置附加包含目录
5.编译生成libcurl.lib 和 libcurl.dll
生成的文件在curl-7.71.1\build\Win64\VC10\DLL Release文件夹下:
int CurlSdk::HttpsGet(const string& strUrl, string& strResponse, const char * pCaPath)
{
CURLcode res;
CURL* pCurl = curl_easy_init();
if(nullptr == pCurl)
{
return CURLE_FAILED_INIT;
}
if(m_bDebug)
{
curl_easy_setopt(pCurl, CURLOPT_VERBOSE, 1);
curl_easy_setopt(pCurl, CURLOPT_DEBUGFUNCTION, OnDebug);
}
//https
if(NULL == pCaPath)
{
curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, false);//设定为不验证证书和HOST
curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYHOST, false);
}
else
{
curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, true);
curl_easy_setopt(pCurl, CURLOPT_CAINFO, pCaPath);
}
curl_easy_setopt(pCurl, CURLOPT_URL, strUrl.c_str());
curl_easy_setopt(pCurl, CURLOPT_READFUNCTION, NULL);
curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, onWriteFunc);//设置回调函数
curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, static_cast(&strResponse));
curl_easy_setopt(pCurl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);//开启digest认证
//当多个线程都使用超时处理的时候,同时主线程中有sleep或是wait等操作。
//如果不设置这个选项,libcurl将会发信号打断这个wait从而导致程序退出。
curl_easy_setopt(pCurl, CURLOPT_NOSIGNAL, 1);
curl_easy_setopt(pCurl, CURLOPT_CONNECTTIMEOUT, 3);
curl_easy_setopt(pCurl, CURLOPT_TIMEOUT, 6);
res = curl_easy_perform(pCurl);
curl_easy_cleanup(pCurl);
return res;
}
int CurlSdk::HttpPost(const string& strUrl, const string& strPost, const string &sHeader, string& strResponse)
{
QMutexLocker guard(&m_lock);
CURLcode res;
CURL* pCurl = curl_easy_init();
if(nullptr == pCurl)
{
return CURLE_FAILED_INIT;
}
if(m_bDebug)
{
curl_easy_setopt(pCurl, CURLOPT_VERBOSE, 1);
curl_easy_setopt(pCurl, CURLOPT_DEBUGFUNCTION, OnDebug);
}
curl_easy_setopt(pCurl, CURLOPT_URL, strUrl.c_str());
curl_easy_setopt(pCurl, CURLOPT_POST, 1);
curl_easy_setopt(pCurl, CURLOPT_POSTFIELDS, strPost.c_str());
curl_easy_setopt(pCurl, CURLOPT_READFUNCTION, NULL);
curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, onWriteFunc);
curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, static_cast(&strResponse));
curl_easy_setopt(pCurl, CURLOPT_NOSIGNAL, 1);
curl_easy_setopt(pCurl, CURLOPT_CONNECTTIMEOUT, 8);
curl_easy_setopt(pCurl, CURLOPT_TIMEOUT, 8);
struct curl_slist *pSlist = nullptr;
pSlist = curl_slist_append(pSlist, sHeader.c_str());
curl_easy_setopt(pCurl, CURLOPT_HTTPHEADER, pSlist);
res = curl_easy_perform(pCurl);
curl_easy_cleanup(pCurl);
return res;
}