使用 WININET 的简单 HTTP 客户端






3.76/5 (46投票s)
2003年3月24日
1分钟阅读

610014

13267
简单 HTTP 客户端,HTTP GET,HTTP POST,HTTP POST-MultiPartFormData
引言
这个类用于 HTTP 请求。它支持 HTTP GET、HTTP POST 和 HTTP POST-MultiPartFormData。
类概述
class GenericHTTPClient {
public:
...
// CONSTRUCTOR & DESTRUCTOR
GenericHTTPClient();
virtual ~GenericHTTPClient();
...
// Connection handler
BOOL Connect( LPCTSTR szAddress,
LPCTSTR szAgent = __DEFAULT_AGENT_NAME,
unsigned short nPort = INTERNET_DEFAULT_HTTP_PORT,
LPCTSTR szUserAccount = NULL,
LPCTSTR szPassword = NULL);
BOOL Close();
VOID InitilizePostArguments();
// HTTP Arguments handler
VOID AddPostArguments(LPCTSTR szName, DWORD nValue);
VOID AddPostArguments(LPCTSTR szName, LPCTSTR szValue,
BOOL bBinary = FALSE);
// HTTP Method handler
BOOL Request( LPCTSTR szURL,
int nMethod = GenericHTTPClient::RequestGetMethod,
LPCTSTR szAgent = __DEFAULT_AGENT_NAME);
BOOL RequestOfURI(LPCTSTR szURI, int nMethod =
GenericHTTPClient::RequestGetMethod);
BOOL Response(PBYTE pHeaderBuffer, DWORD dwHeaderBufferLength,
PBYTE pBuffer, DWORD dwBufferLength, DWORD &dwResultSize);
LPCTSTR QueryHTTPResponse();
LPCTSTR QueryHTTPResponseHeader();
// General Handler
DWORD GetLastError();
LPCTSTR GetContentType(LPCTSTR szName);
VOID ParseURL(LPCTSTR szURL, LPTSTR szProtocol, LPTSTR szAddress,
DWORD &dwPort, LPTSTR szURI);
protected:
...
};
Connect(...)
方法连接到 HTTP 服务器。Close()
方法关闭连接。这些方法与RequestOfURI(...)
一起使用。InitilizePostArguments()
方法初始化 POST 参数。AddPostArguments(...)
方法支持添加以下 3 种类型的新的 POST 参数(TCHAR、DWORD、FILE
)。Request(...)
方法用于尝试使用 URL 进行 HTTP 请求(GET、POST、POST-MULTIPARTFORMDATA)。HTTP 方法间接有 3 种类型。GenericHTTPClient::GetMethod
是 HTTP GET 请求GenericHTTPClient::PostMethod
是 HTTP POST 请求GenericHTTPClient::PostMultiPartsFormData
是带有二进制表单数据的 HTTP POST 请求
RequestOfURI(...)
方法允许您使用 URI 尝试 HTTP 请求。此方法与Connect(...)
和Close()
一起使用。Response(...)
方法以字节为单位提供 HTTP 响应。QueryHTTPResponse()
方法用于接收 HTTP 请求的 HTML。QueryHTTPResponseHeader()
方法用于接收关于QueryHTTPResponse()
的 HTTP 头部信息。GetLastError()
方法用于获取 Windows 错误代码。GetContentType(...)
方法用于获取 MIME 类型。ParseURL(...)
方法解析 URL 为协议(HTTP、HTTPS)和地址(或主机名)和端口、URI。
用法
现在,您可以简单地进行 HTTP GET 请求迭代。
....
GenericHTTPClient httpClient;
if(httpRequest.Request("https://codeproject.org.cn")){
LPCTSTR szHTML=httpRequest.QueryResponse();
}else{
LPVOID lpMsgBuffer;
DWORD dwRet=FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
httpRequest.GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
reinterpret_cast<LPTSTR>(&lpMsgBuffer),
0,
NULL);
MessageBox( reinterpret_cast<LPTSTR>(lpMsgBuffer), "ERROR", MB_OK);
LocalFree(lpMsgBuffer);
}
这是带有文件发布的 HTTP POST 请求(HTTP POST Multipart/form-data)
GenericHTTPClient *pClient=new GenericHTTPClient();
pClient->InitilizePostArguments();
pClient->AddPostArguments(__TAG_USRID, szUserID);
pClient->AddPostArguments(__TAG_JUMIN, szSocialIndex);
pClient->AddPostArguments(__TAG_SRC, szSource);
pClient->AddPostArguments(__TAG_DST, szDestination);
pClient->AddPostArguments(__TAG_FORMAT, szFormat);
pClient->AddPostArguments(__TAG_SUBJECT, szMessage);
if(bCharge){
pClient->AddPostArguments(__TAG_CHARGE, "Y");
}else{
pClient->AddPostArguments(__TAG_CHARGE, "N");
}
pClient->AddPostArguments(__TAG_CPCODE, szCPCode);
pClient->AddPostArguments(__TAG_FILE, szFile, TRUE);
if(pClient->Request(szURL,
GenericHTTPClient::RequestPostMethodMultiPartsFormData)){
LPCTSTR szResult=pClient->QueryHTTPResponse();
}else{
#ifdef _DEBUG
LPVOID lpMsgBuffer;
DWORD dwRet=FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
pClient->GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
reinterpret_cast<LPTSTR>(&lpMsgBuffer),
0,
NULL);
OutputDebugString(reinterpret_cast<LPTSTR>(lpMsgBuffer));
LocalFree(lpMsgBuffer);
#endif
}
}
谢谢
感谢您阅读我的文章,并原谅我糟糕的英语。;p