c++ libcurl使用(使用类)

libcurl主要功能就是用不同的协议连接和沟通不同的服务器~也就是相当封装了的sockPHP 支持libcurl(允许你用不同的协议连接和沟通不同的服务器)。, libcurl当前支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传(当然你也可以使用PHP的ftp扩展), HTTP基本表单上传,代理,cookies,和 用户认证。(include文件和lib文件地址 百度网盘:http://pan.baidu.com/s/1pKIO0Bp)
HttpClient.h
class CHttpClient
{
public:
CHttpClient(void);
~CHttpClient(void);


public:  
    /** 
    * @brief HTTP POST请求 
    * @param strUrl 输入参数,请求的Url地址,如:http://www.baidu.com 
    * @param strPost 输入参数,使用Json格式 
    * @param strResponse 输出参数,返回的内容
* @param retcode 输出参数,返回的状态码
    * @return 返回是否Post成功 
    */  
    static int Post(const std::string & strUrl, const std::string & strPost, std::string & strResponse,long & retcode);  


/** 
    * @brief HTTP POST请求  上传文件
    * @param strUrl 输入参数,请求的Url地址
    * @param strPost 输入参数,文件名
    * @param strResponse 输出参数,返回的内容
* @param retcode 输出参数,返回的状态码
    * @return 返回是否Post成功 
    */  
/*int Upload(const std::string & strUrl,  const char*  fileName, std::string & strResponse,long & retcode); */


static int Upload(const std::string & strUrl,  const char*  fileName, const std::string & strFileContent,std::string & strResponse,long & retcode); 


/** 
    * @brief HTTP POST请求  下载文件
    * @param strUrl 输入参数,请求的Url地址
    * @param strPost 输入参数,文件名
    * @param strResponse 输出参数,返回的内容
* @param retcode 输出参数,返回的状态码
    * @return 返回是否Post成功 
    */  
static  int Download(const std::string & strUrl,  const char*  fileName, std::string & strFileContent,long & retcode); 
  
    /** 
    * @brief HTTP GET请求 
    * @param strUrl 输入参数,请求的Url地址,如:http://www.baidu.com 
    * @param strResponse 输出参数,返回的内容 
* @param retcode 输出参数,返回的状态码 
    * @return 返回是否Post成功 
    */  
static  int Get(const std::string & strUrl, std::string & strResponse,long & retcode);  
  
    /** 
    * @brief HTTPS POST请求,无证书版本 
    * @param strUrl 输入参数,请求的Url地址,如:https://www.alipay.com 
    * @param strPost 输入参数,使用如下格式Json格式 
    * @param strResponse 输出参数,返回的内容 
* @param retcode 输出参数,返回的状态码
    * @param pCaPath 输入参数,为CA证书的路径.如果输入为NULL,则不验证服务器端证书的有效性. 
    * @return 返回是否Post成功 
    */  
    static  int Posts(const std::string & strUrl, const std::string & strPost, std::string & strResponse,long & retcode,const char * pCaPath = NULL);  
  
    /** 
    * @brief HTTPS GET请求,无证书版本 
    * @param strUrl 输入参数,请求的Url地址,如:https://www.alipay.com 
    * @param strResponse 输出参数,返回的内容 
* @param retcode 输出参数,返回的状态码
    * @param pCaPath 输入参数,为CA证书的路径.如果输入为NULL,则不验证服务器端证书的有效性. 
    * @return 返回是否Post成功 
    */  
    static  int Gets(const std::string & strUrl, std::string & strResponse,long & retcode,const char * pCaPath = NULL);  

 /** 
    * @brief HTTP PUT请求 
    * @param strUrl 输入参数,请求的Url地址,如:http://www.baidu.com 
    * @param strPost 输入参数,使用Json格式 
    * @param strResponse 输出参数,返回的内容
* @param retcode 输出参数,返回的状态码
    * @return 返回是否Post成功 
    */  
static  int Put(const std::string & strUrl, const std::string & strPost, std::string & strResponse,long & retcode); 


/** 
    * @brief HTTPS PUT请求,无证书版本 
    * @param strUrl 输入参数,请求的Url地址,如:https://www.alipay.com 
    * @param strPost 输入参数,使用如下格式Json格式 
    * @param strResponse 输出参数,返回的内容 
* @param retcode 输出参数,返回的状态码
    * @param pCaPath 输入参数,为CA证书的路径.如果输入为NULL,则不验证服务器端证书的有效性. 
    * @return 返回是否Post成功 
    */  
    static  int Puts(const std::string & strUrl, const std::string & strPost, std::string & strResponse,long & retcode,const char * pCaPath = NULL);  


 /** 
    * @brief HTTP Delete请求 
    * @param strUrl 输入参数,请求的Url地址,如:http://www.baidu.com 
    * @param strResponse 输出参数,返回的内容
* @param retcode 输出参数,返回的状态码
    * @return 返回是否Post成功 
    */  
static  int DeleteRequest(const std::string & strUrl,std::string & strResponse,long & retcode); 


static  std::string GetErroStr(long retcode);


static  std::string GetUrlCodeStirng(int nIndex );

/** 
    * @brief HTTP POST请求  编码解码
    * @param strUrl 输入参数,请求的Url地址
    * @param strPost 输入参数,文件名
    * @param strResponse 输出参数,返回的内容
* @param retcode 输出参数,返回的状态码
    * @return 返回是否Post成功 
    */  
static int CodeOrDecodeStr(const std::string & strUrl, const std::string & strFileContent,std::string & strResponse,long & retcode,BOOL bImage=FALSE); 


public:  
    static  void SetDebug(bool bDebug);  
  
private:  
    static  bool m_bDebug; 

};
HttpClient.cpp
bool CHttpClient::m_bDebug = false;
CHttpClient::CHttpClient(void)
{

}


CHttpClient::~CHttpClient(void)
{
 
}


static int OnDebug(CURL *, curl_infotype itype, char * pData, size_t size, void *)  
{  
if(itype == CURLINFO_TEXT)  
{  
//printf("[TEXT]%s\n", pData);  
}  
else if(itype == CURLINFO_HEADER_IN)  
{  
printf("[HEADER_IN]%s\n", pData);  
}  
else if(itype == CURLINFO_HEADER_OUT)  
{  
printf("[HEADER_OUT]%s\n", pData);  
}  
else if(itype == CURLINFO_DATA_IN)  
{  
printf("[DATA_IN]%s\n", pData);  
}  
else if(itype == CURLINFO_DATA_OUT)  
{  
printf("[DATA_OUT]%s\n", pData);  
}  
return 0;  



static size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid)  
{  
std::string* str = dynamic_cast<std::string*>((std::string *)lpVoid);  
if( NULL == str || NULL == buffer )  
{  
return -1;  
}  


char* pData = (char*)buffer;  
str->append(pData, size * nmemb);  
return nmemb;  
}  






int CHttpClient::Post(const std::string & strUrl, const std::string & strPost, std::string & strResponse,long & retcode)
{
curl_global_init(CURL_GLOBAL_ALL);
CURLcode res;  


CURL* curl = curl_easy_init();  
if(NULL == curl)  
{  
return CURLE_FAILED_INIT;  
}  
if(m_bDebug)  
{  
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);  
curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);  
}  
curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str()); 
curl_easy_setopt(curl, CURLOPT_POST, 1);  
// 设置http发送的内容类型为JSON  
curl_slist *plist = curl_slist_append(NULL,   
"Content-Type:application/json;charset=UTF-8");  
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, plist); 
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strPost.c_str());  
curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);  
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);  
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);  
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);  
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 2000);  
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);  
res = curl_easy_perform(curl);  
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE , &retcode); 
curl_easy_cleanup(curl);  


curl_global_cleanup(); 
return res;  
}


int CHttpClient::Get(const std::string & strUrl, std::string & strResponse,long & retcode)
{
curl_global_init(CURL_GLOBAL_ALL);
CURLcode res;  

    CURL* curl = curl_easy_init();  
    if(NULL == curl)  
    {  
        return CURLE_FAILED_INIT;  
    }  
    if(m_bDebug)  
    {  
        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);  
        curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);  
    }  
curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str()); 
//std::string strParmate = strUserName.c_str();
//strParmate+=":";
// strParmate+=strPsw.c_str();
// curl_easy_setopt(curl, CURLOPT_USERPWD,strParmate.c_str());
// curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST|CURLAUTH_BASIC);
    curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);  
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);  
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);  
    /** 
    * 当多个线程都使用超时处理的时候,同时主线程中有sleep或是wait等操作。 
    * 如果不设置这个选项,libcurl将会发信号打断这个wait从而导致程序退出。 
    */  
    curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);  
    curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 6);  
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);  
    res = curl_easy_perform(curl);  
//获取状态码
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE , &retcode); 

//
    curl_easy_cleanup(curl);
curl_global_cleanup(); 
    return res; 
}


int CHttpClient::Posts(const std::string & strUrl, const std::string & strPost, std::string & strResponse,long & retcode, const char * pCaPath /*= NULL*/)
{
curl_global_init(CURL_GLOBAL_ALL);
CURLcode res;  

CURL* curl = curl_easy_init();  
if(NULL == curl)  
{  
return CURLE_FAILED_INIT;  
}  
if(m_bDebug)  
{  
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);  
curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);  
}  
curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());  
curl_easy_setopt(curl, CURLOPT_POST, 1);  
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strPost.c_str());  
curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);  
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);  
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);  
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);  
if(NULL == pCaPath)  
{  
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);  
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);  
}  
else  
{  
//缺省情况就是PEM,所以无需设置,另外支持DER  
//curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM");  
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true);  
curl_easy_setopt(curl, CURLOPT_CAINFO, pCaPath);  
}  
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 60);  
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);  
res = curl_easy_perform(curl); 
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE , &retcode); 
curl_easy_cleanup(curl);  


curl_global_cleanup(); 
return res;  
}


int CHttpClient::Gets(const std::string & strUrl, std::string & strResponse,long & retcode,const char * pCaPath /*= NULL*/)
{
curl_global_init(CURL_GLOBAL_ALL);
CURLcode res;  
CURL* curl = curl_easy_init();  
if(NULL == curl)  
{  
return CURLE_FAILED_INIT;  
}  
if(m_bDebug)  
{  
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);  
curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);  
}  
curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());  
curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);  
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);  
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);  
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);  
if(NULL == pCaPath)  
{  
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_CAINFO, pCaPath);  
}  
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 60);  
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);  
res = curl_easy_perform(curl); 
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE , &retcode); 
curl_easy_cleanup(curl); 


curl_global_cleanup(); 
return res;
}


void CHttpClient::SetDebug(bool bDebug)
{
m_bDebug = bDebug;  
}


int CHttpClient::Put(const std::string & strUrl, const std::string & strPost, std::string & strResponse,long & retcode)
{
curl_global_init(CURL_GLOBAL_ALL);
CURLcode res;  
CURL* curl = curl_easy_init();  
if(NULL == curl)  
{  
return CURLE_FAILED_INIT;  
}  
if(m_bDebug)  
{  
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);  
curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);  
}  
curl_easy_setopt(curl, CURLOPT_POST, 0L);              //关闭put请求
curl_easy_setopt(curl,CURLOPT_CUSTOMREQUEST,"PUT");
curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str()); 
//
curl_slist *plist = curl_slist_append(NULL,   
"Content-Type:application/json;charset=UTF-8");  
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, plist); 
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strPost.c_str());
//
curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);  
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);  
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);  
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);  
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 60);  
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);  
res = curl_easy_perform(curl);  
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE , &retcode); 
curl_easy_cleanup(curl);


curl_global_cleanup(); 
return res;
}


int CHttpClient::DeleteRequest(const std::string & strUrl,std::string & strResponse,long & retcode)
{
curl_global_init(CURL_GLOBAL_ALL);
CURLcode res;  
CURL* curl = curl_easy_init();  
if(NULL == curl)  
{  
return CURLE_FAILED_INIT;  
}  
if(m_bDebug)  
{  
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);  
curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);  
}  
curl_easy_setopt(curl, CURLOPT_POST, 0L);              //关闭put请求
curl_easy_setopt(curl,CURLOPT_CUSTOMREQUEST,"delete");
curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str()); 


curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);  
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);  
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);  
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);  
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 60);  
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);  
res = curl_easy_perform(curl);  
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE , &retcode); 
curl_easy_cleanup(curl);

curl_global_cleanup(); 
return res;
}


std::string CHttpClient::GetErroStr(long retcode)
{
if(retcode==401)
return ERROR_HTTP_UNAUTHORIZED;
if(retcode==403)
return ERROR_HTTP_FORBIDDEN;
if(retcode==404)
return ERROR_HTTP_NOTFOUND;
if(retcode==405)
return ERROR_HTTP_METHOD_NOT_ALLOWED;
if(retcode==409)
return ERROR_HTTP_CONFLICT;
if(retcode==415)
return ERROR_HTTP_UNSUPPORTED;
if(retcode==500)
return ERROR_HTTP_INTERNAL;
if(retcode==801)
return ERROR_HTTP_FAILE;


return "";
}


int CHttpClient::Download(const std::string & strUrl, const char* fileName,std::string & strFileContent,long & retcode)
{
std::string strResponse;
curl_global_init(CURL_GLOBAL_ALL);
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(NULL == curl)  
{  
return CURLE_FAILED_INIT;  
}  
if(m_bDebug)  
{  
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);  
curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);  
}  

curl_easy_setopt(curl, CURLOPT_URL,strUrl.c_str());
curl_easy_setopt(curl, CURLOPT_POST,1);


USES_CONVERSION;
Json::Value var_Value;


var_Value["fileName"]= std::string(Base64::encode(fileName));
Json::FastWriter fast_write;
//return A2W(fast_write.write(var_Value));
std::string strXml = fast_write.write(var_Value);
//
curl_slist *plist = curl_slist_append(NULL,   
"Content-Type:application/json;charset=UTF-8");  
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, plist); 
curl_easy_setopt(curl, CURLOPT_POSTFIELDS,strXml.c_str());  
//执行写入文件流操作
//curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteFile);//当有数据被写入,回调函数被调用,
//curl_easy_setopt(curl, CURLOPT_WRITEDATA, ftpfile); //设置结构体的指针传递给回调函数
curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);  
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);  
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strFileContent); 



curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 2000);  
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);  
res = curl_easy_perform(curl);


curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE , &retcode); 
//释放curl对象
curl_easy_cleanup(curl);

curl_global_cleanup(); 
return res;
}


 int CHttpClient::Upload(const std::string & strUrl, const char* fileName, const std::string & strFileContent,std::string & strResponse,long & retcode)
 {
USES_CONVERSION;
curl_global_init(CURL_GLOBAL_ALL);
  CURL *curl;
  CURLcode res;


  std::string strUploadName = fileName;
//单斜杠替换
//CString strReplace = CCommonOp::UTF8ToUnicode(strUploadName.c_str(),strlen(strUploadName.c_str()));
//strReplace.Replace(_T("\\"),_T("\\\\"));
//
vector<std::string> vecFile;
std::size_t nIndex = strUploadName.find('\\');
while (nIndex!=std::string::npos)
{
std::string strPath = strUploadName.substr(0,nIndex);
vecFile.push_back(strPath);
strUploadName = strUploadName.substr(nIndex+1);
nIndex = strUploadName.find('\\');
}
vecFile.push_back(strUploadName);
strUploadName="";
//
vector<std::string>::iterator it;
int nCount=0;
for (it=vecFile.begin();it!=vecFile.end();it++,nCount++)
{
if(nCount==0)
strUploadName=*it;
else
{
strUploadName +="\\\\";
strUploadName +=*it;
}
}
strUploadName = CCommonOp::UnicodeToUTF8(A2W(strUploadName.c_str()));
  curl = curl_easy_init();
  //
  strUploadName = Base64::encode(strUploadName);
//strUploadName = Base64::encode(W2A(strReplace.GetBuffer(0)));
  //
std::string strTemp;

strTemp = Base64::encode(strFileContent);//Base64::encode(CCommonOp::UnicodeToUTF8(A2W(strFileContent.c_str())));
  if(curl) {
  //也许有Expect: 100-continue,去掉它
  curl_slist* pOptionList = NULL;
  pOptionList = curl_slist_append(pOptionList, "Expect:");
  curl_easy_setopt(curl, CURLOPT_HTTPHEADER, pOptionList);
 
  struct curl_httppost* post = NULL;
  struct curl_httppost* last = NULL;
 
  const char * remoteNewFileKey = "title";
  const char * remoteNewFileName = "d.ttt";
  curl_formadd(&post, &last, CURLFORM_COPYNAME, remoteNewFileKey, CURLFORM_COPYCONTENTS, remoteNewFileName, CURLFORM_END);  
  curl_formadd(&post, &last,
  CURLFORM_COPYNAME, "file",
  CURLFORM_BUFFER, strUploadName.c_str(),//"datasource.xml"
  CURLFORM_BUFFERPTR, strTemp.c_str(),
  CURLFORM_BUFFERLENGTH, strTemp.length(),
  CURLFORM_END);
  //curl_formadd(&post, &last, CURLFORM_COPYNAME, "end", CURLFORM_COPYCONTENTS, "end", CURLFORM_END);
  curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str()); 
  //curl_formadd(&post, &last, CURLFORM_COPYNAME, "file",CURLFORM_CONTENTTYPE,"text/xml", CURLFORM_FILE, fileName,CURLFORM_FILENAME ,Base64::encode(fileName),CURLFORM_END);
  curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);  
  curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);  
  curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);
  curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
  curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)strTemp.length()); // upload file size--- Content-Length: size
 
  curl_easy_setopt(curl, CURLOPT_MAX_SEND_SPEED_LARGE, 20*1000);    // speed limit
 
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 2000);  
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);  
  res = curl_easy_perform(curl);
  //获取状态码
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE , &retcode); 
  curl_formfree(post);
  curl_easy_cleanup(curl);   
 
 
curl_global_cleanup(); 
  return res;
 }


 std::string CHttpClient::GetUrlCodeStirng(int nIndex)
 {
if(nIndex==0)
return "成功";
else if(nIndex==28)
return "连接超时";
return "";
 }


 int CHttpClient::CodeOrDecodeStr(const std::string & strUrl, const std::string & strFileContent,std::string & strResponse,long & retcode,BOOL bImage/*=FALSE*/)
 {
USES_CONVERSION;
curl_global_init(CURL_GLOBAL_ALL);
CURL *curl;
CURLcode res;


curl = curl_easy_init();


std::string strTemp;


//   if(!bImage)
//   strTemp = Base64::encode(strFileContent);//Base64::encode(CCommonOp::UnicodeToUTF8(A2W(strFileContent.c_str())));
//   else
strTemp = strFileContent;
if(curl) {
//也许有Expect: 100-continue,去掉它
curl_slist* pOptionList = NULL;
pOptionList = curl_slist_append(pOptionList, "Expect:");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, pOptionList);


struct curl_httppost* post = NULL;
struct curl_httppost* last = NULL;


const char * remoteNewFileKey = "title";
const char * remoteNewFileName = "d.ttt";
curl_formadd(&post, &last, CURLFORM_COPYNAME, remoteNewFileKey, CURLFORM_COPYCONTENTS, remoteNewFileName, CURLFORM_END);  
if(bImage)
{
curl_formadd(&post, &last,
CURLFORM_COPYNAME, "file",
CURLFORM_BUFFER, "Image",//"datasource.xml"
CURLFORM_BUFFERPTR, strTemp.c_str(),
CURLFORM_BUFFERLENGTH, strTemp.length(),
CURLFORM_END);
}
else
{
curl_formadd(&post, &last,
CURLFORM_COPYNAME, "file",
CURLFORM_BUFFER, "",//"datasource.xml"
CURLFORM_BUFFERPTR, strTemp.c_str(),
CURLFORM_BUFFERLENGTH, strTemp.length(),
CURLFORM_END);
}
//curl_formadd(&post, &last, CURLFORM_COPYNAME, "end", CURLFORM_COPYCONTENTS, "end", CURLFORM_END);
curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str()); 
//curl_formadd(&post, &last, CURLFORM_COPYNAME, "file",CURLFORM_CONTENTTYPE,"text/xml", CURLFORM_FILE, fileName,CURLFORM_FILENAME ,Base64::encode(fileName),CURLFORM_END);
curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);  
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);  
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);
curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)strTemp.length()); // upload file size--- Content-Length: size


curl_easy_setopt(curl, CURLOPT_MAX_SEND_SPEED_LARGE, 20*1000);    // speed limit


curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 2000);  
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);  
res = curl_easy_perform(curl);
//获取状态码
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE , &retcode); 
curl_formfree(post);
curl_easy_cleanup(curl);   



curl_global_cleanup(); 
return res;
 }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值