VC怎么实现POST网络数据

IwGhostpit 2013-12-21 08:24:36
Key="abcd123"
Secret="456def"
Key和Secret一一对应
在程序中用Secret作为密码,通过SHA512加密方式签名需要POST给服务器的数据得到Sign,并在HTTPS请求
的Header部分传回Key和Sign。

发送的数据:一个随机数,或若干参数
发送头:Key和Sign
URL: https://bter.com/api/1/private/getfunds
...全文
2124 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
我喝多了 2014-09-22
  • 打赏
  • 举报
回复
winhttp是最好的, 当然要配合 http 协议, 写吧, 骚年
我喝多了 2014-09-22
  • 打赏
  • 举报
回复
winhttp, 模拟IE 的post
IwGhostpit 2014-09-22
  • 打赏
  • 举报
回复
还是木有解决啊!
msnuser 2014-04-02
  • 打赏
  • 举报
回复
用抓包工具抓包,然后模拟提交就可以。
yu578707139 2014-03-12
  • 打赏
  • 举报
回复
请问楼主解决了没?
wumn29 2014-01-27
  • 打赏
  • 举报
回复
代码量最少的办法, 写一个js文件,比如request.js。 代码如下:

var xh = new ActiveXObject("Microsoft.XMLHTTP");
xh.onreadystatechange = function()
{
   var res = xh.responseText;
    //在res里面解析Key和Sign
}
xh.open("POST", "https://bter.com/api/1/private/getfunds?Key=xxx&Secret=fff&rd=" + new Date().getTime(),true);                    
xh.send();  
c++里直接ShellExcute或者CreateProcess创建进程, 参数就写:"wscript.exe ./request.js" 当然js肯定是可以接受命令行参数的, 你可以将请求的url和参数传入 直接在C++里面调用Microsoft.XMLHTTP也不复杂, Microsoft.XMLHTTP就是一个COM组件的progid, 按照常规方法创建COM组件 大致方法如下, 声明一个智能指针: MSXML::IXMLHttpRequestPtr m_spXmlRequest; HRESULT hr = m_spXmlRequest.CreateInstance(__uuidof(MSXML::XMLHTTPRequest)); char* lpolestrUrl = "https://bter.com/api/1/private/getfunds?Key=xxx&Secret=fff&rd=32423"; _variant_t varp(true); hr = m_spXmlRequest->raw_open(_bstr_t("POST"),_bstr_t(lpolestrUrl),varp); m_spXmlRequest->put_onreadystatechange(this);//当前类必须继承自IDispatch, 且实现了Invoke函数, 在Invoke函数里面处理dispID等于0的情形 m_spXmlRequest->raw_send(); 具体的在搜索引擎里面打入:C++ MSXML::XMLHTTPRequest就有了。 总之我觉得这个最省代码了
鲨卷风芬哥 2014-01-26
  • 打赏
  • 举报
回复
引用 7 楼 VisualEleven 的回复:
用抓包工具抓个包看一下发送的数据,然后用WinINET的CInternetSession模拟提交即可。
斑竹大人,我这个问题该怎么办。
鲨卷风芬哥 2014-01-26
  • 打赏
  • 举报
回复
话说我也遇到一个奇葩问题。 用HttpOpenRequest发送GET请求,无论发送多少请求,都只用一个TCP连接。但是如果发送POST请求,那么一个请求就新建一条连接。不知道是为什么,我现在就想让所有请求都从一个连接里面走。
Eleven 2014-01-12
  • 打赏
  • 举报
回复
用抓包工具抓个包看一下发送的数据,然后用WinINET的CInternetSession模拟提交即可。
jlj 2014-01-11
  • 打赏
  • 举报
回复
我也有类似问题,请问楼主现在解决了吗?
IwGhostpit 2014-01-03
  • 打赏
  • 举报
回复
还是不行啊,返回消息说sign或者key不合法,大神们快帮帮我啊!!
5t4rk 2013-12-24
  • 打赏
  • 举报
回复
InternetOpen InternetOpenUrl HttpQueryInfo InternetReadFile
IwGhostpit 2013-12-22
  • 打赏
  • 举报
回复
这是我的源码,请指教:
CString strSecret = "456def";

	int ret = 0;
	
	CString m_strRequest = "nonce=1138197510251393";  //随机数

	char ret_buf[SHA512_DIGEST_SIZE + 1] = {0};  //SHA512_DIGEST_SIZE = 64
	char *base64_ret = NULL;

	ret = hmac_sha512(strSecret.GetBuffer(0), strSecret.GetLength(), 

m_strRequest.GetBuffer(0), m_strRequest.GetLength(), ret_buf);
	if (ret < 0) {
		MessageBox("加密出错!");
		return;
	}

	ret = base64_encode_alloc(ret_buf, SHA512_DIGEST_SIZE, &base64_ret);      

	CString strSign = "";
	strSign .Format("%s", base64_ret);
	if(base64_ret != NULL) {
		free(base64_ret);

	} else {
		MessageBox("转码出错!");
		return;
	}

	CString m_strServerName = "cn.bter.com";
	CString	m_strObjectName = "api/1/private/getfunds";
	CInternetSession m_InetSession("session"); 
	CHttpConnection* pServer = NULL;
	CHttpFile* pFile = NULL;
	try{
		INTERNET_PORT nPort;
		nPort=80;
		pServer = m_InetSession.GetHttpConnection(m_strServerName, nPort);
		pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST, 
			m_strObjectName);

		CString strHeader = "Accept: text*/*\r\nContent-Type: application/x-www-

form-urlencoded";
		//strcpy_s(szHeaders, strTemp.GetLength(), strTemp.GetBuffer(0));
		
		strHeader += "\r\nKey=abcd123";
		strHeader += "\r\nSign=";
		strHeader += strSign;
		
		pFile->AddRequestHeaders(strHeader.GetBuffer(0));

		pFile->SendRequestEx(m_strRequest.GetLength());	
		pFile->WriteString(m_strRequest);   
		pFile->EndRequest();
		DWORD dwRet;
		pFile->QueryInfoStatusCode(dwRet);
		CString str;

		//m_Mutex.Lock();
		CString m_strHtml="";
		char szBuff[1024];
		if (dwRet == HTTP_STATUS_OK){
			UINT nRead;
			while ((nRead = pFile->Read(szBuff,1023))>0)
			{
				m_strHtml+=CString(szBuff,nRead);
			}
		}
		//m_Mutex.Unlock();
		MessageBox(m_strHtml);

		delete pFile;
		delete pServer;
	}
	catch (CInternetException* e){
		CString s;
		s.Format("Internet Exception\r\nm_dwError%u,m_dwContextError%u",e-

>m_dwError,e->m_dwContext);
		AfxMessageBox(s);
		//catch errors from WinInet
	}
IwGhostpit 2013-12-22
  • 打赏
  • 举报
回复
用SHA512方法用Secret加密postdata怎么实现?
ysjyniiq 2013-12-21
  • 打赏
  • 举报
回复
使用wininet相关函数,详细百度一下wininet post

18,363

社区成员

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

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