无法通过 CHttpFile - C++/MFC 发送开机自检请求
Unable to send POST request via CHttpFile - C++/MFC
我的目标:我正在尝试提交帖子请求
问题:发布请求未发送、格式不正确或缺少某些信息。我不确定确切的问题。
什么是成功的发布请求:对网站的成功发布请求将更改用户的Country location
,这是网站功能的一部分。
当前程序输出:我得到200 -OK
响应并且没有错误
附加信息:在下面的代码中,我发出了 2 个请求。
从第一个请求开始,我接收并读取了一个 html 页面以查找RequestDigest
值。此值是执行对 SharePoint 网站的提交请求所必需的。
对于第二个请求,我使用找到的RequestDigest
值并将其添加到 post 请求中,并将用户的国家/地区更改为加拿大 ("CA"(。
注意:我是C++/MFC的新手,我已经在这个问题上停留了一个多星期! 任何帮助和/或指导将不胜感激
void CUserPassDiag::Connect(){
CInternetSession session(_T("My Session"));
CHttpConnection* pServer = NULL;
CHttpFile* pFile = NULL;
char *szBuff = new char[100000];
try
{
// First Request to retrieve the Digest value
CString strServerName = _T("boration.ptt.ca");
CString headers = _T("Content-Type: application/x-www-form-urlencodedrn");
headers += _T("Host: boration.ptt.carn");
headers += _T("Method: POSTrn");
headers += _T("Pragma: no-cachern");
headers += _T("Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, *//*rn");
headers += _T("UserAgent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET CLR 1.1.4322; .NET4.0C; .NET4.0E; InfoPath.3rn");
headers += _T("Keep-Alive: truern");
headers += _T("Accept-Language: en-CArn");
headers += _T("Referer: http://boration.ptt.ca/team/physicallocation/_Layouts/Ptt.PhysicalLocationWidget/Page.aspxrn");
// Headers Ready
CString szHeaders = _T(headers);
DWORD dwRet;
// URL
CString strObject = _T("/team/D135/SitePages/PttHome.aspx");
// get connection with username and password
pServer = session.GetHttpConnection(strServerName, INTERNET_DEFAULT_HTTP_PORT, _T("user"), _T("pass"));
// open request
pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST, strObject);
pFile->AddRequestHeaders(szHeaders);
pFile->SendRequest();
pFile->QueryInfoStatusCode(dwRet); // response is 200 OK
// Data is retrieve and can be queried for digest value
pFile->Read(szBuff,100000);
CString digest = CString(szBuff);
std::string str = digest.GetString();
std::smatch match;
std::regex re("0x(\d|[A-Z]).*0000");
if (std::regex_search(str, match, re)){
digest = CString(std::string(match[0]).c_str());
}
// close the server and chttpfile
pServer->Close();
pFile->Close();
/*
* Second Request Preperation
*/
// Post data - CA stands for Canada and this value is added to the post reuquest to change the users country
CString country = "CA";
// add a new header
CString xRequestDigest = "X-RequestDigest: " + digest + _T("rn");
headers += xRequestDigest;
// formatting the digest value to be placed in the post request
digest.Replace(_T(" "),_T("+"));
digest.Replace(_T(":"),_T("%3A"));
digest.Replace(_T(","),_T("%2C"));
// new URL
strObject = _T("/team/physicallocation/_Layouts/Ptt.PhysicalLocationWidget/Page.aspx");
// post data to be sent
CString strFormData = _T("__REQUESTDIGEST=" + digest + "&__VIEWSTATE=%2FwEPDwUKLTM0MDQ5MzI3MQ9kFgJmD2QWAgIBDxYCHgVjbGFzcwUtbXMtZGlhbG9nIG1zLWRpYWxvZy1uciBtcy1kaWFsb2cgbXMtZGlhbG9nLW5yFgICAw9kFg4CEQ9kFgRmD2QWBAIBD2QWAgIBDxYCHgdWaXNpYmxlaBYCZg9kFgQCAg9kFgQCAQ8WAh8BaGQCAw8WCB4TQ2xpZW50T25DbGlja1NjcmlwdAWPAWphdmFTY3JpcHQ6Q29yZUludm9rZSgnVGFrZU9mZmxpbmVUb0NsaWVudFJlYWwnLDEsIDEsICdodHRwOlx1MDAyZlx1MDAyZnhjb2xsYWJvcmF0aW9uLnB3Yy5jYVx1MDAyZnRlYW1cdTAwMmZwaHlzaWNhbGxvY2F0aW9uJywgLTEsIC0xLCAnJywgJycpHhhDbGllbnRPbkNsaWNrTmF2aWdhdGVVcmxkHihDbGllbnRPbkNsaWNrU2NyaXB0Q29udGFpbmluZ1ByZWZpeGVkVXJsZB4MSGlkZGVuU2NyaXB0BSFUYWtlT2ZmbGluZURpc2FibGVkKDEsIDEsIC0xLCAtMSlkAgMPDxYKHglBY2Nlc3NLZXkFAS8eD0Fycm93SW1hZ2VXaWR0aAIFHhBBcnJvd0ltYWdlSGVpZ2h0AgMeEUFycm93SW1hZ2VPZmZzZXRYZh4RQXJyb3dJbWFnZU9mZnNldFkC6wNkZAIDD2QWAgIBD2QWAgIDD2QWAgIBDzwrAAUBAA8WAh4PU2l0ZU1hcFByb3ZpZGVyBRFTUFNpdGVNYXBQcm92aWRlcmRkAgEPZBYEAgMPZBYCZg9kFgJmDxQrAANkBSNodHRwOi8vbXlzaXRlLnB3Yy5jYTo4MC9QZXJzb24uYXNweAUYaHR0cDovL215c2l0ZS5wd2MuY2E6ODAvZAIFDw8WBB4EVGV4dAUeTGF1bmNoIHRoZSBEZXZlbG9wZXIgRGFzaGJvYXJkHwFoZGQCFw9kFgICAQ9kFgJmD2QWAgIBDw9kFgYfAAUibXMtc2J0YWJsZSBtcy1zYnRhYmxlLWV4IHM0LXNlYXJjaB4LY2VsbHBhZGRpbmcFATAeC2NlbGxzcGFjaW5nBQEwZAIbD2QWAgIBDxAWAh8BaGQUKwEAZAIhD2QWAmYPZBYCAgEPDxYGHgtOYXZpZ2F0ZVVybAWBAWphdmFzY3JpcHQ6IFNob3dEaWFsb2coJ2h0dHA6Ly94Y29sbGFib3JhdGlvbi5wd2MuY2EvdGVhbS9waHlzaWNhbGxvY2F0aW9uL19MYXlvdXRzL1BXQy5QaHlzaWNhbExvY2F0aW9uV2lkZ2V0L0NvdW50cnlQYWdlLmFzcHgnKR4HVG9vbFRpcAUyQ291bnRyeTogQ2FuYWRhDQpFeHBpcmVzIGluOiAyMyAgSG91ciAgNTcgIE1pbnV0ZXMeCEltYWdlVXJsBTkvX2xheW91dHMvc3RhdGljL1BXQy5QaHlzaWNhbExvY2F0aW9uV2lkZ2V0L2ltYWdlcy9DQS5wbmdkZAInD2QWAmYPZBYCAgEPDxYCHwwFFlRFQ0hOSUNBTCBEQVRBIEFMTE9XRURkZAJFD2QWAgIJD2QWAgIBDw8WAh8BaGQWAgIDD2QWAmYPZBYCAgMPZBYCAgUPDxYEHgZIZWlnaHQbAAAAAAAAeUABAAAAHgRfIVNCAoABZBYCAgEPPCsACQEADxYEHg1QYXRoU2VwYXJhdG9yBAgeDU5ldmVyRXhwYW5kZWRnZGQCWQ9kFgICAQ9kFgYCAQ8PFgIfAWhkFgoCAQ8PFgIfDAUvQ29uZmlybSB5b3VyIGN1cnJlbnQgcGh5c2ljYWwgbG9jYXRpb24gY291bnRyeS5kZAIDDw8WAh8MBRlBcmUgeW91IHN0aWxsIGluIENhbmFkYSA%2FZGQCBQ8PFgIfDAXlAVRvIGRldGVybWluZSBpZiB0ZWNobmljYWwgZGF0YSBpcyBhY2Nlc3NpYmxlLCB5b3VyIGN1cnJlbnQgcGh5c2ljYWwgbG9jYXRpb24gbXVzdCBiZSBwcm92aWRlZC4gPGJyLz48YnIvPg0KQWxsIHZhbHVlcyBwcm92aWRlZCBhcmUgbG9nZ2VkIGFuZCByZXRhaW5lZCBmb3IgYXVkaXRpbmcgcHVycG9zZXMuPGJyLz48YnIvPk1ha2Ugc3VyZSB0byB1cGRhdGUgbG9jYXRpb24gd2hlbiB0cmF2ZWxsaW5nLiBkZAIHDw8WAh8MBQNZZXNkZAIJDw8WAh8MBQJOb2RkAgMPDxYCHwFnZBYUZg8PFgIfDAU1UGxlYXNlIHNlbGVjdCB5b3VyIGN1cnJlbnQgcGh5c2ljYWwgbG9jYXRpb24gY291bnRyeS5kZAIBDw8WAh8MBQhDb3VudHJ5OmRkAgIPDxYCHwwFC1VzZXIgTmFtZSA6ZGQCAw8PFgIfDAUdUmFuYSwgVGFpbW9vciAgICAgICAgICAgICBQV0NkZAIEDw8WAh8MBQZEYXRlIDpkZAIFDw8WAh8MBQtIb3N0IE5hbWUgOmRkAgYPDxYCHwwFGUY1LU1haW5JUC1pbnRlcm5hbC5wd2MuY2FkZAIIDw8WAh8MBeUBVG8gZGV0ZXJtaW5lIGlmIHRlY2huaWNhbCBkYXRhIGlzIGFjY2Vzc2libGUsIHlvdXIgY3VycmVudCBwaHlzaWNhbCBsb2NhdGlvbiBtdXN0IGJlIHByb3ZpZGVkLiA8YnIvPjxici8%2BDQpBbGwgdmFsdWVzIHByb3ZpZGVkIGFyZSBsb2dnZWQgYW5kIHJldGFpbmVkIGZvciBhdWRpdGluZyBwdXJwb3Nlcy48YnIvPjxici8%2BTWFrZSBzdXJlIHRvIHVwZGF0ZSBsb2NhdGlvbiB3aGVuIHRyYXZlbGxpbmcuIGRkAgoPDxYCHwwFB0NvbmZpcm1kZAILDw8WAh8MBQZDYW5jZWxkZAIFD2QWBAIBDw8WAh8MBQdXYXJuaW5nZGQCBQ8PFgIfDAUFQ2xvc2VkZGQShQ6UJsf5SBoFkPM2ZpdvDrHQ0w%3D%3D&__EVENTVALIDATION=%2FwEWBwKO0pUjAqmflsILAs2u9bkDAr36nu0CAo3uhpUDAubLxrYNAtT449AGHxcQwoL9xE%2FsJbw1%2BBKH5DPplNg%3D&ctl00%24PlaceHolderSearchArea%24ctl01%24ctl00=http%3A%2F%2Fxcollaboration.pwc.ca%2Fteam%2Fphysicallocation&InputKeywords=Search+this+site...&ctl00%24PlaceHolderSearchArea%24ctl01%24ctl04=0&countries="+country+"&ctl00%24PlaceHolderMain%24inpHide="+country+"&ctl00%24PlaceHolderMain%24btnSave=Confirm&__spText1=&__spText2=");
// Open connection
pServer = session.GetHttpConnection(strServerName, INTERNET_DEFAULT_HTTP_PORT, _T("user"), _T("pass"));
pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST, strObject);
// add 'content-length' header
CString contentLength;
contentLength.Format("Content-Length: %d",strFormData.GetLength());
contentLength+= "rn";
headers += _T(contentLength);
szHeaders = _T(headers);
// add the header
pFile->AddRequestHeaders(szHeaders);
//make a new request
bool res = pFile->SendRequest(szHeaders,(LPVOID)(LPCSTR)strFormData ,strFormData.GetLength());
pFile->QueryInfoStatusCode(dwRet);
TRACE("n%dn",res);
}catch(CInternetException* e){
TCHAR sz[1024];
e->GetErrorMessage(sz,1024);
_tprintf_s(_T("ERROR! %sn"), sz);
e->Delete();
}
session.Close();
}
您的代码似乎很好,请确保您从正确的地址获取摘要值。
代码看起来不错,但我缺少一个pFile->EndRequest();
- 但这不应该是原因。
如果我是你,我会检查服务器响应,即查看服务器访问日志。您需要在这里更具体,以便人们可以提供帮助。如果收到 200 响应,也可能是服务器问题。
相关文章:
- C++ MFC Libraries in Travis CI
- 从 bmp 文件数据创建 MFC CBitmap
- 如何在 MFC 中显示文件的所有行
- 目录删除 MFC 的问题
- MFC:如何设置CEdit框的焦点?
- MFC 中的抗锯齿
- 双击更改 mfc 中列表控件中的行的颜色
- C++MFC编辑框处理双击
- C++ MFC CObject 派生类摘要?
- 如何在 MFC 对话框中使用 OnDraw
- 在 1 个服务器 n 客户端套接字 C++ MFC 应用程序中更新数据的客户端
- MFC:你能在CDateTimeCtrl中改变自旋的加速度吗?
- MFC:我们如何轻松地从CTreeCtrl切换到CTreeView?
- __int64 CString 返回错误的值 - C++ MFC
- 如何在MFC中的静态文本控件上插入图标?
- 使用 MFC 的表/网格
- MFC 中的窗口消息管理:添加基类调用是否是强制性的?
- 使用 cpprest 发送开机自检
- 使用IE引擎下载页面+使用开机自检
- 无法通过 CHttpFile - C++/MFC 发送开机自检请求