之前通过libcurl开发只是做http请求,这次公司项目需要请求https,所以就研究了一下,其实用libcurl做http请求是非常简单的,所有底层实现都被封装到了libcurl里面(默认编译的libcurl是没有附加SSL的,也就是说默认的libcurl是不带https功能的,因此需要自己重新编译,这里是一个libcurl支持https,可以直接用),具体关于https的实现如下:
int CHttpClient::sendRequest(std::string strRequestType,
std::string strUrl,
std::string& strReport,
std::string& strRetHeader,
std::vector<std::string> vecHeader,
std::string strParam/* ="" */,
std::string strCookie/* ="" */,
std::string strCaPath/* ="" */,
int nTimeOut/* =0 */)
{
CURL* curl;
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());
if (strRequestType.compare("post") == 0 || strRequestType.compare("POST") == 0)
{
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(strParam.c_str()));//post内容长度
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strParam.c_str());
}
else
{
curl_easy_setopt(curl, CURLOPT_POST, 0);//get请求
}
//设置http头
curl_slist* headers = NULL;
for (int i = 0; i < vecHeader.size(); i++)
{
if (!vecHeader.at(i).empty())
{
headers = curl_slist_append(headers, vecHeader.at(i).c_str());
}
}
if (headers != NULL)
{
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
}
curl_easy_setopt(curl, CURLOPT_SSLVERSION, 1);
//判断是否有证书
if (strCaPath.empty())
{
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
}
else
{
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, true);
curl_easy_setopt(curl, CURLOPT_CAINFO, "C:/ssl/cacert.pem");
curl_easy_setopt(curl, CURLOPT_SSLCERT, "C:/ssl/client.pem");
curl_easy_setopt(curl, CURLOPT_SSLCERTPASSWD, "11111111");
curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, "PEM");
curl_easy_setopt(curl, CURLOPT_SSLKEY, "C:/ssl/clientkey.pem");
curl_easy_setopt(curl, CURLOPT_SSLKEYPASSWD, "11111111");
curl_easy_setopt(curl, CURLOPT_SSLKEYTYPE, "PEM");
}
//Web服务器一般会重定向链接,比如访问http:/xxx/x1.do自动转到http:/xxx/x2.do
//所以一定要设置CURLOPT_FOLLOWLOCATION为1,否则重定向后的数据不会返回。
//curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION,1);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); //可以看到调试信息
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, _CURL_::write_data);
curl_easy_setopt(curl, CURLOPT_WRITEHEADER, &strRetHeader);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, _CURL_::write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &strReport);
if (nTimeOut > 0)
{
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, nTimeOut);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, nTimeOut);
}
if (!strCookie.empty())
{
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, strCookie.c_str());
}
CURLcode code = curl_easy_perform(curl);
if (code != CURLE_OK)
{
printf("curl_wasy_perform error = %s", curl_easy_strerror(code));
}
if (headers != NULL)
{
curl_slist_free_all(headers);
}
curl_easy_cleanup(curl);
return code;
}