之前一直通过CHttpClient类的ExecuteRequest函数来调用webapi相关接口,以Post方式传参也基本都是一个参数为主。最近因项目需要Post两个参数(一个是string类型,另一个是json类型)给服务端,束手无策了,请求大神给与指点,先谢过!CHttpClient类如下://头文件
class CHttpClient
{
public:
CHttpClient(LPCTSTR strAgent = IE_AGENT);
virtual ~CHttpClient(void); int HttpGet(LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse);
int HttpPost(LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse);private:
int ExecuteRequest(LPCTSTR strMethod, LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse);
void Clear();private:
CInternetSession *m_pSession;
CHttpConnection *m_pConnection;
CHttpFile *m_pFile;
};//源文件
int CHttpClient::ExecuteRequest(LPCTSTR strMethod, LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse)
{
CString strServer;
CString strObject;
DWORD dwServiceType;
INTERNET_PORT nPort;
strResponse = "";
char *psText; AfxParseURL(strUrl, dwServiceType, strServer, strObject, nPort); if(AFX_INET_SERVICE_HTTP != dwServiceType && AFX_INET_SERVICE_HTTPS != dwServiceType)
{
return FAILURE;
} try
{
m_pConnection = m_pSession->GetHttpConnection(strServer,
dwServiceType == AFX_INET_SERVICE_HTTP ? NORMAL_CONNECT : SECURE_CONNECT
,nPort,_T(""),_T(""));
m_pFile = m_pConnection->OpenRequest(strMethod, strObject,NULL, 1, NULL, NULL, 
(dwServiceType == AFX_INET_SERVICE_HTTP ? NORMAL_REQUEST : SECURE_REQUEST)); DWORD dwFlags;
m_pFile->QueryOption(INTERNET_OPTION_SECURITY_FLAGS, dwFlags);
dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
//set web server option
m_pFile->SetOption(INTERNET_OPTION_SECURITY_FLAGS, dwFlags);
m_pFile->SetOption(INTERNET_OPTION_SEND_TIMEOUT, PDLG->m_stAPP.nHttpSendTimeOut);
m_pFile->SetOption(INTERNET_OPTION_DATA_SEND_TIMEOUT, PDLG->m_stAPP.nHttpSendTimeOut);
m_pFile->SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT, PDLG->m_stAPP.nHttpSendTimeOut);
m_pFile->SetOption(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, PDLG->m_stAPP.nHttpSendTimeOut); m_pFile->AddRequestHeaders(_T("Accept: *,*/*"));
m_pFile->AddRequestHeaders(_T("Accept-Language: zh-cn"));
m_pFile->AddRequestHeaders(_T("Content-Type: application/json"));
m_pFile->AddRequestHeaders(_T("Accept-Encoding: gzip, deflate")); DWORD dwNum = WideCharToMultiByte(CP_UTF8,NULL,strPostData,-1,NULL,0,NULL,FALSE);
psText = new char[dwNum];
if(!psText)
{
delete []psText;
return FAILURE;
}
WideCharToMultiByte (CP_UTF8,NULL,strPostData,-1,psText,dwNum,NULL,FALSE);
//m_pFile->SendRequest(NULL, 0, (LPVOID)(LPCTSTR)strPostData, strPostData == NULL ? 0 : _tcslen(strPostData));
m_pFile->SendRequest(NULL, 0, (LPVOID)psText, strPostData == NULL ? 0 : dwNum);
delete []psText; char szChars[BUFFER_SIZE + 1] = {0};
char buf[BUFFER_SIZE];
memset(buf, 0, BUFFER_SIZE);
UINT nLen=0;
string strRawResponse = "";
UINT nReaded = 0;
while ((nReaded = m_pFile->Read((void*)szChars, BUFFER_SIZE)) > 0)
{
szChars[nReaded] = '\0';
strRawResponse += szChars;
memcpy(&buf[nLen],szChars,nReaded);
nLen+=nReaded;
memset(szChars, 0, BUFFER_SIZE + 1);
} int unicodeLen = MultiByteToWideChar(CP_UTF8, 0, strRawResponse.c_str(), -1, NULL, 0);
WCHAR *pUnicode = new WCHAR[unicodeLen + 1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t)); MultiByteToWideChar(CP_UTF8,0,strRawResponse.c_str(),-1, pUnicode,unicodeLen);
CString cs(pUnicode);
delete []pUnicode; 
pUnicode = NULL; //strResponse = cs;
USES_CONVERSION;
string str(W2A(cs));
strResponse=str; Clear();
}
return SUCCESS;
}