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;
};
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;
}
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;
}