MFC通过CHttpClient怎样Post多个参数

landeli2 2019-04-05 10:35:16
之前一直通过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;
}
...全文
522 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_44942544 2019-04-19
  • 打赏
  • 举报
回复
ding!!
向立天 2019-04-06
  • 打赏
  • 举报
回复
post不管几个参数不都是通过&结合的么
sichuanwww 2019-04-06
  • 打赏
  • 举报
回复

看一下浏览器的地址栏的状况
landeli2 2019-04-05
  • 打赏
  • 举报
回复
为自己顶一下!

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧