65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 WININET 的简单 HTTP 客户端

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.76/5 (46投票s)

2003年3月24日

1分钟阅读

viewsIcon

610014

downloadIcon

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

© . All rights reserved.