VC实现http发送get和post请求

VC实现http发送get和post请求

get请求

首先通过前面介绍的抓包工具获取请求的详细内容,然后再通过VC拼接Header,函数如下:
bool CXXX::http_get_eng_mode()
{
	//<?xml version=\"1.0\" encoding=\"US-ASCII\"?> 


<RGW><param><method>call</method><session>000</session><obj_path>cm</obj_path><obj_method>get_wan_configs</obj_me


thod></param></RGW>
	CString strURL=_T("http://")+loginfo.strIPAddress+_T("/xml_action.cgi?


method=get&module=duster&file=wan");
	bool bResult = false;
	DWORD dwType = 0;
	CString strServer;
	CString strObject;
	INTERNET_PORT wPort = 0;
	DWORD dwFileLength = 0;


	bResult =  AfxParseURL(strURL, dwType, strServer, strObject, wPort);
	if(!bResult)
	{
		return false;
	}
	int iCount=0;
	bool bRet=true;
	while (bRet)
	{
		if (iCount>2)
		{
			bRet=false;
		}
		try
		{
			CInternetSession Session ; 
			CHttpConnection *pHttpConnect = Session.GetHttpConnection(strServer, wPort) ;
			if(pHttpConnect)
			{
				CHttpFile* pFile = pHttpConnect->OpenRequest( CHttpConnection::HTTP_VERB_GET, 
					_T("/xml_action.cgi?method=get&module=duster&file=wan")); //
				if ( pFile )
				{
					CString strAuthHeader=getAuthHeader


(loginfo.strAdmin,loginfo.strPassword,"GET");
					pFile->AddRequestHeaders(strAuthHeader);
					pFile->AddRequestHeaders("Expires: -1");					
					pFile->AddRequestHeaders("Accept: */*");					
					pFile->AddRequestHeaders("Cache-Control: no-store, no-cache, must-


revalidate");
					pFile->AddRequestHeaders("Pragma: no-cache");
					pFile->AddRequestHeaders("X-Requested-With: XMLHttpRequest");
					CString strTemp=_T("");strTemp=_T("Referer: 


http://")+loginfo.strIPAddress+_T("/index_pc.html");
					pFile->AddRequestHeaders(strTemp);
					pFile->AddRequestHeaders("Accept-Language: zh-CN");
					pFile->AddRequestHeaders("Accept-Encoding: gzip, deflate");
					pFile->AddRequestHeaders("User-Agent: Mozilla/5.0 (Windows NT 6.1; 


Trident/7.0; rv:11.0) like Gecko");
					CString strHost=_T("Host: ")+loginfo.strIPAddress;
					pFile->AddRequestHeaders(strHost) ;
					pFile->AddRequestHeaders("Connection: Keep-Alive");
					pFile->AddRequestHeaders("Cookie: locale=en; platform=mifi") ;


					if (!pFile->SendRequest())
					{
						pFile->Close();
						pHttpConnect->Close();						
						return false;
					}
					
					DWORD dwStateCode = 0;
					pFile->QueryInfoStatusCode(dwStateCode);
					if(dwStateCode == HTTP_STATUS_OK) 
					{
						CString strInfo1;
						DWORD dw1=0;
						pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF ,strInfo1 ,&dw1) ;
						CString strInfo2;
						DWORD dw2=0;
						pFile->QueryInfo(HTTP_QUERY_CONTENT_BASE ,strInfo2 ,&dw2);
						char content_return[1024*10];memset(content_return,0,1024*10);
						pFile->Read(content_return, SERVER_CONTENT_LEN);
						
						//解析xml,查询工程模式
						CString str=getEngMode_1802(_bstr_t(content_return));
						if (!str.IsEmpty())
						{
							if (!IsEngModeOpen(0,str))
							{
								//如果没有开启的话,需要先打开
								http_set_eng_mode_1802(true);
							}
						}
						else
						{
							bResult=false;
						}						
					}
					else
					{
						bResult=false;
					}
					pFile->Close();
					delete pFile ;
					bRet=false;
				}
				pHttpConnect->Close() ;
				delete pHttpConnect ;
			}
		}
		catch( CInternetException *e )
		{
			e->Delete();    
		}
	}
	return bResult;
}

post请求

bool CXXX::http_set_eng_mode(bool bEnable)
{
	CString requestData=_T("");
	if (bEnable)
	{
		requestData = "<?xml version=\"1.0\" encoding=\"US-ASCII\"?> 


<RGW><param><method>call</method><session>000</session><obj_path>cm</obj_path><obj_method>set_eng_mode</obj_metho


d></param><wan><mode>1</mode></wan></RGW>";
	}
	else
	{
		requestData = "<?xml version=\"1.0\" encoding=\"US-ASCII\"?> 


<RGW><param><method>call</method><session>000</session><obj_path>cm</obj_path><obj_method>set_eng_mode</obj_metho


d></param><wan><mode>0</mode></wan></RGW>";
	}
	
	CString strURL=_T("http://")+loginfo.strIPAddress+_T("/xml_action.cgi?method=set");
	bool bResult = false;
	DWORD dwType = 0;
	CString strServer;
	CString strObject;
	INTERNET_PORT wPort = 0;
	DWORD dwFileLength = 0;


	bResult =  AfxParseURL(strURL, dwType, strServer, strObject, wPort);
	if(!bResult)
	{
		return false;
	}
	int iCount=0;
	bool bRet=true;
	while (bRet)
	{
		if (iCount>2)
		{
			bRet=false;
		}
		try
		{
			
			CInternetSession Session ; 
						
			CHttpConnection *pHttpConnect = Session.GetHttpConnection(strServer, wPort) ;
			if(pHttpConnect)
			{
				CHttpFile* pFile = pHttpConnect->OpenRequest( CHttpConnection::HTTP_VERB_POST, 
					_T("/xml_action.cgi?method=set"),
					NULL,
					1,
					NULL,
					NULL,
					INTERNET_FLAG_NO_COOKIES); //
				if ( pFile )
				{					
					//打开工程模式
					pFile->AddRequestHeaders("Accept: application/xml, text/xml, */*; 


q=0.01");
					pFile->AddRequestHeaders("Content-Type: application/x-www-form-


urlencoded; charset=UTF-8");
					CString strAuthHeader=getAuthHeader


(loginfo.strAdmin,loginfo.strPassword,"POST");
					pFile->AddRequestHeaders(strAuthHeader);
					pFile->AddRequestHeaders("X-Requested-With: XMLHttpRequest");
					CString strTemp=_T("");strTemp=_T("Referer: 


http://")+loginfo.strIPAddress+_T("/index.html");
					pFile->AddRequestHeaders(strTemp);
					pFile->AddRequestHeaders("Accept-Language: zh-CN");
					pFile->AddRequestHeaders("Accept-Encoding: gzip, deflate");
					pFile->AddRequestHeaders("User-Agent: Mozilla/5.0 (Windows NT 6.1; 


Trident/7.0; rv:11.0) like Gecko");
					CString strHost=_T("Host: ")+loginfo.strIPAddress;
					pFile->AddRequestHeaders(strHost);
					int iLength=requestData.GetLength();
					CString strLength=_T("");strLength.Format("Content-Length: %d",iLength);
				
					pFile->AddRequestHeaders(strLength);
					pFile->AddRequestHeaders("Connection: Keep-Alive");
					pFile->AddRequestHeaders("Pragma: no-cache");
					//Cookie: CGISID=8CeJlM1rEpSJSaCag78vaHYqoF9EewhmbnYo9QFF6zqZG
					
					CString strCookie1=_T("Cookie: ")+setcookie;
					pFile->AddRequestHeaders(strCookie1);


					if(!pFile->SendRequest(NULL,0,(void*)requestData.GetBuffer


(requestData.GetLength()), requestData.GetLength()))
					{
						pFile->Close();
						pHttpConnect->Close();						
						return false;
					}			
					DWORD dwStateCode = 0;
					pFile->QueryInfoStatusCode(dwStateCode);
					
					if(dwStateCode == HTTP_STATUS_OK) 
					{
						CString strInfo1;
						DWORD dw1=0;
						pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF ,strInfo1 ,&dw1);
						char content_return[1024*10];memset(content_return,0,1024*10);
						pFile->Read(content_return, SERVER_CONTENT_LEN);
					}
					pFile->Close();
					delete pFile ;
					bRet=false;
				}
				pHttpConnect->Close() ;
				delete pHttpConnect ;
			}
		}
		catch( CInternetException *e )
		{
			e->Delete();    
		}
	}
	return bResult;
}

较get请求而言,主要是除了Header外还需要post数据。


  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
VC实现POST发送JSON可以通过以下步骤实现: 1. 引入必要的头文件 在代码中引入以下头文件: ```c++ #include <iostream> #include <string> #include <winhttp.h> ``` 2. 创建WinHTTP会话和连接 ```c++ HINTERNET hSession = WinHttpOpen(L"WinHTTP Example/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); if (hSession == NULL) { std::wcout << L"Failed to open WinHTTP session!" << std::endl; return 1; } HINTERNET hConnect = WinHttpOpenRequest(hSession, L"POST", L"www.example.com", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0); if (hConnect == NULL) { std::wcout << L"Failed to open WinHTTP connection!" << std::endl; WinHttpCloseHandle(hSession); return 1; } ``` 3. 设置请求头信息 ```c++ std::wstring headerData = L"Content-Type: application/json; charset=utf-8\r\n"; BOOL setResult = WinHttpAddRequestHeaders(hConnect, headerData.c_str(), headerData.length(), WINHTTP_ADDREQ_FLAG_ADD); if (!setResult) { std::wcout << L"Failed to set request headers!" << std::endl; WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); return 1; } ``` 4. 发送JSON数据 ```c++ std::wstring jsonData = L"{\"key\": \"value\"}"; setResult = WinHttpSendRequest(hConnect, WINHTTP_NO_ADDITIONAL_HEADERS, 0, (LPVOID)jsonData.c_str(), jsonData.length(), jsonData.length(), 0); if (!setResult) { std::wcout << L"Failed to send JSON data!" << std::endl; WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); return 1; } ``` 5. 接收服务器响应 ```c++ setResult = WinHttpReceiveResponse(hConnect, NULL); if (!setResult) { std::wcout << L"Failed to receive response!" << std::endl; WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); return 1; } DWORD statusCode = 0; DWORD statusCodeSize = sizeof(DWORD); WinHttpQueryHeaders(hConnect, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, NULL, &statusCode, &statusCodeSize, NULL); std::wcout << L"Response Status Code: " << statusCode << std::endl; DWORD bytesRead = 0; char buffer[4096]; std::wstring response; while (WinHttpReadData(hConnect, buffer, sizeof(buffer), &bytesRead)) { response.append(buffer, bytesRead); if (bytesRead == 0) { break; } } std::wcout << L"Response Body: " << response << std::endl; ``` 6. 清理资源 ```c++ WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); ``` 以上是使用VC实现POST发送JSON的基本步骤。根据实际需求,你可能需要进行适当的异常处理和参数配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法哥2012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值