1.返回一块内存数据
若数据为空,则不会回调函数WriteMemoryCallback,也就不会写入内存chunk;
若数据不为空,则回调函数WriteMemoryCallback,写入内存chunk;
代码如下:
bool cathttpclient::HttpPost(IN const std::string &strshorturl,IN const std::string&strshortdata, OUTstd::string&strrecvdata)
{
if (m_strServerUrl.empty())
returnfalse;
std::string strurl("");
strurl= m_strServerUrl + strshorturl;
std::string strpostdata("");
if (!GetPacketInfo(strshortdata,strpostdata))
returnfalse;
//LOG_ALL_ERROR(QString("httppost:")+ QString(strpostdata.c_str()));
CURLcoderes;
//会不会是问题出在这里
curl_global_init(CURL_GLOBAL_ALL);
CURL*curl = curl_easy_init();
//set_share_handle(curl);
if(NULL == curl)
returnfalse;
std::string strutf8("");
struct MemoryStruct chunk;
chunk.memory = (char *)malloc(1); /* will be grown as needed by the reallocabove */
chunk.size = 0; /* no data at this point */
curl_easy_setopt(curl, CURLOPT_URL,strurl.c_str());
curl_easy_setopt(curl, CURLOPT_POST,1);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS,strpostdata.c_str());
curl_easy_setopt(curl,CURLOPT_POSTFIELDSIZE,strpostdata.size());
curl_easy_setopt(curl, CURLOPT_READFUNCTION,NULL);
/* send alldata to this function */
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,WriteMemoryCallback);
/* we passour 'chunk' struct to the callback function */
curl_easy_setopt(curl, CURLOPT_WRITEDATA,(void *)&chunk);
//curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION, OnWriteData);
//curl_easy_setopt(curl,CURLOPT_WRITEDATA, (void *)&strutf8);
curl_easy_setopt(curl, CURLOPT_NOSIGNAL,1);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS,100000);
curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS,100000);
curl_easy_setopt(curl, CURLOPT_COOKIEJAR,sstrCookiePath.c_str());
curl_easy_setopt(curl, CURLOPT_COOKIEFILE,sstrCookiePath.c_str());
res = curl_easy_perform(curl);
if (res != CURLE_OK)
returnres;
else
{
strutf8.append(chunk.memory, chunk.size);
Q_ASSERT(strutf8.size()== chunk.size);
}
curl_easy_cleanup(curl);
free(chunk.memory);
curl_global_cleanup();
//strrecvdata= strutf8;
return res == CURLE_OK&& Utf8TransGb18030(strutf8, strrecvdata);
}
若数据为空,则不会回调函数my_fwrite,也就不会写入文件ftpfile;
若数据不为空,则回调函数my_fwrite,写入文件ftpfile;
代码如下:
bool cathttpclient::get(IN const std::string &stshortrurl,IN const std::string&strshortdata,
IN const std::string &strfilepath)
{
bool bret = false;
if (stshortrurl.empty()|| strfilepath.empty())
{
LOG_ALL_ERROR(QString("faileddownload param is empty."));
returnbret;
}
std::string strpostdata("");
GetPacketInfo(strshortdata, strpostdata);
//strurl like"http://172.16.3.123:8080/temp/getScreenImages?userDes=4E&userKey=D7B7BA3F24A84D738D8B7A15CC30201A&dataLen=0&data=";
std::string strurl(m_strServerUrl + stshortrurl+"?"+strpostdata);
CURL*curl = nullptr;
CURLcoderes;
struct FtpFile ftpfile={
strfilepath.c_str(),
nullptr
};
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if(curl) {
charerrbuf[CURL_ERROR_SIZE];
set_share_handle(curl);
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER,errbuf);
curl_easy_setopt(curl, CURLOPT_URL,strurl.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,my_fwrite);
curl_easy_setopt(curl, CURLOPT_WRITEDATA,&ftpfile);
curl_easy_setopt(curl, CURLOPT_VERBOSE,1L);
curl_easy_setopt(curl, CURLOPT_POST,0);
curl_easy_setopt(curl, CURLOPT_READFUNCTION,NULL);
curl_easy_setopt(curl, CURLOPT_NOSIGNAL,1);
curl_easy_setopt(curl, CURLOPT_COOKIEJAR,sstrCookiePath.c_str());
curl_easy_setopt(curl, CURLOPT_COOKIEFILE,sstrCookiePath.c_str());
res= curl_easy_perform(curl);
if(res != CURLE_OK)
{
LOG_ALL_ERROR(QString(errbuf));
}
else
{
bret = true;
}
curl_easy_cleanup(curl);
curl_global_cleanup();
}
if(ftpfile.stream)
fclose(ftpfile.stream);
return bret;
}