当前位置: 代码迷 >> VC/MFC >> MFC发送跟接收http的一个小程序中有些不懂的地方
  详细解决方案

MFC发送跟接收http的一个小程序中有些不懂的地方

热度:279   发布时间:2016-05-02 03:42:42.0
MFC发送和接收http的一个小程序中有些不懂的地方
本帖最后由 oyljerry 于 2015-08-19 15:26:38 编辑
#include "StdAfx.h"
#include "HttpClient.h"
//#include "yazuoLog.h"

#define  BUFFER_SIZE       1024

#define  NORMAL_CONNECT             INTERNET_FLAG_KEEP_CONNECTION
#define  SECURE_CONNECT                NORMAL_CONNECT | INTERNET_FLAG_SECURE
#define  NORMAL_REQUEST             INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE 
#define  SECURE_REQUEST             NORMAL_REQUEST | INTERNET_FLAG_SECURE | INTERNET_FLAG_IGNORE_CERT_CN_INVALID

CHttpClient::CHttpClient(LPCTSTR strAgent)
{
m_pSession = new CInternetSession(strAgent);
m_pConnection = NULL;
m_pFile = NULL;
}


CHttpClient::~CHttpClient(void)
{
Clear();
if(NULL != m_pSession)
{
m_pSession->Close();
delete m_pSession;
m_pSession = NULL;
}
}

void CHttpClient::Clear()
{
if(NULL != m_pFile)
{
m_pFile->Close();
delete m_pFile;
m_pFile = NULL;
}

if(NULL != m_pConnection)
{
m_pConnection->Close();
delete m_pConnection;
m_pConnection = NULL;
}
}

int CHttpClient::ExecuteRequest(LPCTSTR strMethod, LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse)
{
CString strServer;
CString strObject;
DWORD dwServiceType;
INTERNET_PORT nPort;
strResponse = "";

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);
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->AddRequestHeaders("Accept: *,*/*");
m_pFile->AddRequestHeaders("Accept-Language: zh-cn");
m_pFile->AddRequestHeaders("Content-Type: application/x-www-form-urlencoded");
m_pFile->AddRequestHeaders("Accept-Encoding: gzip, deflate");

m_pFile->SendRequest(NULL, 0, (LPVOID)(LPCTSTR)strPostData, strPostData == NULL ? 0 : _tcslen(strPostData));

char szChars[BUFFER_SIZE + 1] = {0};
string strRawResponse = "";
UINT nReaded = 0;
while ((nReaded = m_pFile->Read((void*)szChars, BUFFER_SIZE)) > 0)
{
szChars[nReaded] = '\0';
strRawResponse += szChars;
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;

Clear();
}
catch (CInternetException* e)
{
Clear();
DWORD dwErrorCode = e->m_dwError;


DWORD dwError = GetLastError();

// PRINT_LOG("dwError = %d", dwError, 0);

if (ERROR_INTERNET_TIMEOUT == dwErrorCode)
{
//throw;
e->Delete();
return OUTTIME;
}
else
{
//throw;
e->Delete();
return FAILURE;

}
}
return SUCCESS;
}

int CHttpClient::HttpGet(LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse)
{
return ExecuteRequest("GET", strUrl, strPostData, strResponse);
}

int CHttpClient::HttpPost(LPCTSTR strUrl, LPCTSTR strPostData, string &strResponse)
{
return ExecuteRequest("POST", strUrl, strPostData, strResponse);
}



strUrl, strPostData, strResponse三个分别是什么?
strUrl是服务器地址吗?列如http://115.159.66.27/xxxx,这样的地址可以吗?
接收到的数据储存在哪里?是strPostData里吗?如果是图片,怎么保存到电脑里?

------解决思路----------------------
下面的关键函数说明,楼主自己分析,就应该知道了

CHttpConnection::OpenRequest
CHttpFile* OpenRequest( LPCTSTR pstrVerb, LPCTSTR pstrObjectName, LPCTSTR pstrReferer = NULL, DWORD dwContext = 1, LPCTSTR* pstrAcceptTypes = NULL, LPCTSTR pstrVersion = NULL, DWORD dwFlags = INTERNET_FLAG_EXISTING_CONNECT );

CHttpFile* OpenRequest( int nVerb, LPCTSTR pstrObjectName, LPCTSTR pstrReferer = NULL, DWORD dwContext = 1, LPCTSTR* pstrAcceptTypes = NULL, LPCTSTR pstrVersion = NULL,  DWORD dwFlags = INTERNET_FLAG_EXISTING_CONNECT );

Return Value

A pointer to the CHttpFile object requested. 

Parameters

pstrVerb

A pointer to a string containing the verb to use in the request. If NULL, "GET" is used.

pstrObjectName

A pointer to a string containing the target object of the specified verb. This is generally a filename, an executable module, or a search specifier.

pstrReferer

A pointer to a string that specifies the address (URL) of the document from which the URL in the request (pstrObjectName) was obtained. If NULL, no HTTP header is specified. 

dwContext

The context identifier for the OpenRequest operation. See Remarks for more information about dwContext.

pstrAcceptTypes

A pointer to a null-terminated string indicating content types accepted by the client. If the string is NULL, the servers interpret that the client only accepts documents of type "text/*" (that is, only text documents and not pictures or other binary files). The content type is equivalent to the CGI variable CONTENT_TYPE, which identifies the type of data for queries that have attached information, such as HTTP POST and PUT.

pstrVersion

A pointer to a string defining the HTTP version. If NULL, "HTTP/1.0" is used.

dwFlags

Any combination of the INTERNET_ FLAG_* flags. See the Remarks for a description of possible dwFlags values.

nVerb

A number associated with the HTTP request type. Can be one of the following: 

HTTP request type nVerb value 
HTTP_VERB_POST 0 
HTTP_VERB_GET 1 
HTTP_VERB_HEAD 2 
HTTP_VERB_PUT 3 
HTTP_VERB_LINK 4 
HTTP_VERB_DELETE 5 
HTTP_VERB_UNLINK 6 


Remarks

Call this member function to open an HTTP connection.

dwFlags can be one of the following:

Internet flag Description 
INTERNET_FLAG_RELOAD Forces a download of the requested file, object, or directory listing from the origin server, not from the cache.  
INTERNET_FLAG_DONT_CACHE Does not add the returned entity to the cache.  
INTERNET_FLAG_MAKE_PERSISTENT Adds the returned entity to the cache as a persistent entity. This means that standard cache cleanup, consistency checking, or garbage collection cannot remove this item from the cache. 
INTERNET_FLAG_SECURE Uses secure transaction semantics. This translates to using SSL/PCT and is only meaningful in HTTP requests  
INTERNET_FLAG_NO_AUTO_REDIRECT Used only with HTTP, specifies that redirections should not be automatically handled in CHttpFile::SendRequest.  


Override the dwContext default to set the context identifier to a value of your choosing. The context identifier is associated with this specific operation of the CHttpConnection object created by its CInternetSession object. The value is returned to CInternetSession::OnStatusCallback to provide status on the operation with which it is identified. See the articleInternet First Steps: WinInet for more information about the context identifier. 

------解决思路----------------------
strUrl, 访问的HTTP URL地址
 strPostData, 提交的post数据
 strResponse 获取的返回内容
------解决思路----------------------
你Debug调试一下,看看各个变量的数据就清楚了~
  相关解决方案