c++实现web服务器数据收发

利用微软标准API实现web服务器数据的发送和接受,遇到的问题点:
1.句柄创建
CString strMsg;
int iError = 0;
HINTERNET hint;
HINTERNET hftp;
HINTERNET hconnect;
HINTERNET Openhconnect;
hint = InternetOpen(0, INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY/INTERNET_OPEN_TYPE_PRECONFIG/, 0, 0, 0);
2.建立连接,获得连接句柄
hconnect = InternetConnect(hint, m_strFTPIP, m_iFTPPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
if(hconnect==NULL)
{
iError = GetLastError();
InternetCloseHandle(hint);
AfxMessageBox(_T(“连接失败”));
return;
}
3.创建查询句柄,使用POST方式,这里需要注意,m_strURL这个地址,不是完整的地址,而是IP,端口之后的内容,以/开头的内容,而且必须带"/“.例如
http://10.192.10.123:500/api/testMark,那么这里的strURL就是”/api/testMark"
LPCTSTR szAccept[] = {_T(“/”), NULL};
DWORD dwFlags = INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE;
Openhconnect= HttpOpenRequest(hconnect,L"POST",m_strUrl, HTTP_VERSION/_T(“HTTP/1.1”)/,NULL,szAccept,dwFlags/INTERNET_FLAG_SECURE/,0);
iError=GetLastError();
4.设置http解析的header信息,主要包括字符集,主机,源地址,和Referer,这里需要注意,win10系统,只需要前两项就可以正常访问,win7系统需要全部设置,否者查询状态时候一直返回400或404错误代码,主要就是解析header出了问题,找不到解析数据,因此返回404.
//win10 只需要前两个header设置就可以了
TCHAR headerLanguage[] = _T(“Accept: application/json”);
TCHAR headerCharset[] = _T(“Accept-Charset: utf-8”);
//win7系统需要加上下面三个header
TCHAR headerHost[] = _T(“Host: 10.16.11.11:5003”😉;
TCHAR headerOrigin[] = _T(“Origin: http://10.16.11.61:5003”😉;
TCHAR headerReferer[] = _T(“Referer: http://10.16.11.11:5003/api/testMark”);

		ret=  HttpAddRequestHeaders(Openhconnect,headerLanguage, -1,HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);


			ret=  HttpAddRequestHeaders(Openhconnect,m_strHead,m_strHead.GetLength(),HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);


			ret=  HttpAddRequestHeaders(Openhconnect,headerCharset, -1,HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);

			ret = HttpAddRequestHeaders(Openhconnect, headerHost, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);   
			ret = HttpAddRequestHeaders(Openhconnect, headerOrigin, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);   
			ret = HttpAddRequestHeaders(Openhconnect, headerReferer, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);   

5.发送接口函数内容,格式按照接口函数给的数据就好了有json数据,xml数据,文本数据,可以根据需要自行设置,这里需要转换一下,否者会发送失败.返回12029原因是IE没有设置TLS1.0,TLS1.1,TLS1.2,TLS1.3,有的美颜装IE,也需要安装下,全部勾选就好了,设置方法:控制面板—Internet选项—高级属性—安全选项卡----找到TLS1.0,TLS1.1,TLS1.2,TLS1.3,全部勾选
char utf8PostData[128] = {0};
USES_CONVERSION;
const char* pC = T2A(strCmd);//注意PC指向区域在栈空间
strcpy(utf8PostData, pC);
ret= HttpSendRequest(Openhconnect,0,0,utf8PostData,strlen(utf8PostData));
iError=GetLastError();
6.读取web服务器返回状态码
TCHAR szBuff[1024] = {0};
DWORD dwBuffSize = 1024;
BOOL bRet;
bRet = ::HttpQueryInfo(Openhconnect, HTTP_QUERY_STATUS_CODE, (LPVOID)szBuff, &dwBuffSize, NULL);
iError = ::GetLastError();//返回0
继续查询其他信息可以激活查询获取,然后读取数据即可:
if (bRet)
{
TCHAR szBuff[1024+1] = {0};
DWORD dwBuffSize = 1024*sizeof(szBuff);
bRet = ::HttpQueryInfo(Openhconnect, HTTP_QUERY_CONTENT_LENGTH, (LPVOID)szBuff, &dwBuffSize, NULL);

				memset(szBuff, 0, sizeof(szBuff));   
				dwBuffSize = 1024*sizeof(szBuff);   
				bRet = ::HttpQueryInfo(Openhconnect, HTTP_QUERY_DATE, (LPVOID)szBuff, &dwBuffSize, NULL);   

				memset(szBuff, 0, sizeof(szBuff));   
				dwBuffSize = 1024*sizeof(szBuff);   
				bRet = ::HttpQueryInfo(Openhconnect, HTTP_QUERY_SERVER, (LPVOID)szBuff, &dwBuffSize, NULL);   

				memset(szBuff, 0, sizeof(szBuff));   
				dwBuffSize = 1024*sizeof(szBuff);   
				bRet = ::InternetReadFile(Openhconnect, szBuff, dwBuffSize, &dwBuffSize);   
			
		} 

这样我们就可以和web服务器完成POST方式数据上传以及查询返回结果,如果需要继续解析数据,可以读取数据分析.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值