⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lyoulhttpclient.aspx.htm

📁 CHttpClient的目的是用于简化WinInet的API
💻 HTM
📖 第 1 页 / 共 5 页
字号:

<h2>How to Handle the Returned CHttpResponse Object</h2>

<p>When you send a request using <code>CHttpClient</code>, all the methods will return <code>CHttpResponse</code> object. <code>CHttpResponse</code> represents the response returned by a HTTP web server. <code>CHttpResponse</code> provides the following methods:</p>

<div class="no-vmads"><pre lang="c++"><span class="code-comment">//</span><span class="code-comment"> Returns the number of headers of which name is the szName
</span>
DWORD CHttpResponse::GetHeaderCount (PCSZ szName) <span class="code-keyword">throw</span> (Exception &amp;) ;

<span class="code-comment">//</span><span class="code-comment"> Returns the header of which name is the szName
</span>
PCSZ CHttpResponse::GetHeader (PCSZ szName, 
          DWORD nIdx = <span class="code-digit">0</span>) <span class="code-keyword">throw</span> (Exception &amp;) ;

<span class="code-comment">//</span><span class="code-comment"> Returns the HTTP status code returned by a HTTP server
</span>
DWORD CHttpResponse::GetStatus (<span class="code-keyword">void</span>) <span class="code-keyword">throw</span> (Exception &amp;) ;

<span class="code-comment">//</span><span class="code-comment"> Returns the HTTP status text returned by a HTTP server
</span>
PCSZ CHttpResponse::GetStatusText (<span class="code-keyword">void</span>) <span class="code-keyword">throw</span> (Exception &amp;) ;

<span class="code-comment">//</span><span class="code-comment"> Retrieves the length of the content returned by a HTTP server
</span>
BOOL CHttpResponse::GetContentLength (DWORD &amp; cbContLen) <span class="code-keyword">throw</span> (Exception &amp;) ;

<span class="code-comment">//</span><span class="code-comment"> Reads the content returned by a HTTP server
</span>
DWORD CHttpResponse::ReadContent (<span class="code-SDKkeyword">BYTE</span> * pbyBuff, 
          DWORD cbBuff) <span class="code-keyword">throw</span> (Exception &amp;) ;</pre></div>

<p>The following code demonstrates the basic usage of the <code>CHttpResponse</code> object:</p>

<div class="SmallText" id="premain8" style="width: 100%; cursor: pointer;"><img preid="8" src="lyoulhttpclient.aspx_files/minus.gif" id="preimg8" height="9" width="9"><span preid="8" style="margin-bottom: 0pt;" id="precollapse8"> Collapse</span></div><div style="margin-top: 0pt;" id="pre8" class="no-vmads"><pre lang="c++"><span class="code-keyword">using</span> <span class="code-keyword">namespace</span> Ryeol ;

CHttpResponse *     pobjHttpRes = NULL ;

<span class="code-keyword">try</span> {
    <span class="code-comment">//</span><span class="code-comment"> Get the CHttpResponse object
</span>
    pobjHttpRes = ... ;

    <span class="code-comment">//</span><span class="code-comment"> Reads the HTTP status code
</span>
    _tprintf (_T (<span class="code-string">"</span><span class="code-string">%u"</span>), pobjHttpRes-<span class="code-keyword">&gt;</span>GetStatus ()) ;
    <span class="code-comment">//</span><span class="code-comment"> Reads the HTTP status text
</span>
    _tprintf (_T (<span class="code-string">"</span><span class="code-string"> %s\n"</span>), pobjHttpRes-<span class="code-keyword">&gt;</span>GetStatusText ()) ;

    <span class="code-comment">//</span><span class="code-comment"> Reads HTTP headers using an array of header names
</span>
    <span class="code-keyword">static</span> LPCTSTR      szHeaders[] = 
    { _T (<span class="code-string">"</span><span class="code-string">Server"</span>), _T (<span class="code-string">"</span><span class="code-string">Date"</span>), _T (<span class="code-string">"</span><span class="code-string">X-Powered-By"</span>), 
                _T (<span class="code-string">"</span><span class="code-string">Content-Length"</span>), _T (<span class="code-string">"</span><span class="code-string">Set-Cookie"</span>)
    , _T (<span class="code-string">"</span><span class="code-string">Expires"</span>), _T (<span class="code-string">"</span><span class="code-string">Cache-control"</span>), 
                _T (<span class="code-string">"</span><span class="code-string">Connection"</span>), _T (<span class="code-string">"</span><span class="code-string">Transfer-Encoding"</span>)
    , _T (<span class="code-string">"</span><span class="code-string">Content-Type"</span>) } ;

    LPCTSTR     szHeader ;
    <span class="code-keyword">for</span> (size_t i = <span class="code-digit">0</span>; i <span class="code-keyword">&lt;</span> <span class="code-keyword">sizeof</span> (szHeaders) / <span class="code-keyword">sizeof</span> (LPCTSTR); i++) {
        <span class="code-keyword">if</span> ( szHeader = pobjHttpRes-<span class="code-keyword">&gt;</span>GetHeader (szHeaders[i]) )
            _tprintf (_T (<span class="code-string">"</span><span class="code-string">%s: %s\n"</span>), szHeaders[i], szHeader) ;
        <span class="code-keyword">else</span>
            <span class="code-comment">//</span><span class="code-comment"> If the header is not found..
</span>
            _tprintf (_T (<span class="code-string">"</span><span class="code-string">'%s' header does not exist..\n"</span>), 
                                                    szHeaders[i]) ;
    }
    _tprintf (_T (<span class="code-string">"</span><span class="code-string">\n"</span>)) ;

    <span class="code-comment">//</span><span class="code-comment"> Checks whether the returned stream is a text
</span>
    BOOL        bIsText = FALSE ;
    <span class="code-keyword">if</span> ( szHeader = pobjHttpRes-<span class="code-keyword">&gt;</span>GetHeader (_T (<span class="code-string">"</span><span class="code-string">Content-Type"</span>)) )
        bIsText = (<span class="code-digit">0</span> == ::_tcsncicmp (szHeader, _T (<span class="code-string">"</span><span class="code-string">text/"</span>), <span class="code-digit">5</span>)) ;

    <span class="code-comment">//</span><span class="code-comment"> Reads the length of the stream
</span>
    DWORD       dwContSize ;
    <span class="code-comment">//</span><span class="code-comment"> If the length is not specified
</span>
    <span class="code-keyword">if</span> ( !pobjHttpRes-<span class="code-keyword">&gt;</span>GetContentLength (dwContSize) )
        dwContSize = <span class="code-digit">0</span> ;

    <span class="code-keyword">const</span> DWORD     cbBuff = <span class="code-digit">1024</span> * <span class="code-digit">10</span> ;
    <span class="code-SDKkeyword">BYTE</span>            byBuff[cbBuff] ;
    DWORD           dwRead ;
    size_t          cbTotal = <span class="code-digit">0</span> ;

    <span class="code-comment">//</span><span class="code-comment"> Reads the data stream returned by the HTTP server.
</span>
    <span class="code-keyword">while</span> ( dwRead = pobjHttpRes-<span class="code-keyword">&gt;</span>ReadContent (byBuff, cbBuff - <span class="code-digit">1</span>) ) {
        cbTotal += dwRead ;

        <span class="code-keyword">if</span> ( bIsText ) {
            byBuff[dwRead] = <span class="code-string">'</span><span class="code-string">\0'</span> ;
            printf (<span class="code-string">"</span><span class="code-string">%s"</span>, <span class="code-keyword">reinterpret_cast</span><span class="code-keyword">&lt;</span>LPCSTR<span class="code-keyword">&gt;</span> (byBuff)) ;
        }
    }
    <span class="code-keyword">if</span> ( !bIsText )
        _tprintf (_T (<span class="code-string">"</span><span class="code-string">%u bytes skipped..\n"</span>), cbTotal) ;
} <span class="code-keyword">catch</span> (httpclientexception &amp; e) {
    ...     <span class="code-comment">//</span><span class="code-comment"> Place exception handling codes here.
</span>
}
<span class="code-keyword">delete</span> pobjHttpRes ;
pobjHttpRes = NULL ;</pre></div>

<h2>How to Handle Exception</h2>

<p>When an error occurs, <code>httpclientexception</code> object is thrown:</p>

<div class="no-vmads"><pre lang="c++"><span class="code-keyword">class</span> httpclientexception {
<span class="code-keyword">public</span>:
    <span class="code-comment">//</span><span class="code-comment"> Returns the last error code.
</span>
    <span class="code-comment">//</span><span class="code-comment"> The error codes is defined in RyeolHttpClient.h
</span>
    DWORD LastError (<span class="code-keyword">void</span>) <span class="code-keyword">const</span> <span class="code-keyword">throw</span> () ;

    <span class="code-comment">//</span><span class="code-comment"> Returns the last error message.
</span>
    LPCTSTR errmsg (<span class="code-keyword">void</span>) <span class="code-keyword">const</span> <span class="code-keyword">throw</span> () ;

    <span class="code-comment">//</span><span class="code-comment"> Returns the last win32 error code retrieved by
</span>
    <span class="code-comment">//</span><span class="code-comment"> using ::GetLastError when an error occurred.
</span>
    DWORD Win32LastError (<span class="code-keyword">void</span>) <span class="code-keyword">const</span> <span class="code-keyword">throw</span> () ;
} ;</pre></div>

<p>Before throwing an exception, most methods restore their internal states (all or nothing like transaction). But if you call <code>BeginPost</code> or <code>BeginUpload</code> method, the POST context is automatically canceled. You should write the following <code><span class="code-keyword">try</span></code>-<code><span class="code-keyword">catch</span></code> block to handle the exception:</p>

<div class="no-vmads"><pre lang="c++"><span class="code-keyword">using</span> <span class="code-keyword">namespace</span> Ryeol ;

<span class="code-keyword">try</span> {
    ...     <span class="code-comment">//</span><span class="code-comment"> Place codes which throw a httpclientexception exception
</span>
} <span class="code-keyword">catch</span> (httpclientexception &amp; e) {
    _tprintf (_T (<span class="code-string">"</span><span class="code-string">An error has been occured\n"</span>)) ;
    _tprintf (_T (<span class="code-string">"</span><span class="code-string">ErrCode: 0x%x\n"</span>), e.LastError ()) ;
    _tprintf (_T (<span class="code-string">"</span><span class="code-string">ErrMsg: %s\n"</span>), e.errmsg ()) ;
    <span class="code-keyword">if</span> ( e.Win32LastError () != NO_ERROR ) {
        TCHAR       szErrMsg[<span class="code-digit">512</span>] ;
        GetWinInetErrMsg (szErrMsg, <span class="code-digit">512</span>, e.Win32LastError ()) ;

        _tprintf (_T (<span class="code-string">"</span><span class="code-string">Win32ErrCode: 0x%x\n"</span>), e.Win32LastError ()) ;
        _tprintf (_T (<span class="code-string">"</span><span class="code-string">Win32ErrMsg: %s\n"</span>), szErrMsg) ;
    }
}</pre></div>

<h2>How to Show the Progress Information to the User</h2>

<p>If you call <code>BeginPost</code> or <code>BeginUpload</code> method, you can retrieve the progress information using the <code>Query</code> method:</p>

<div class="no-vmads"><pre lang="c++"><span class="code-comment">//</span><span class="code-comment"> Queries progress information of the current POST context
</span>
<span class="code-comment">//</span><span class="code-comment"> objPostStat      [out] A CHttpPostStat object.
</span>
<span class="code-keyword">void</span> CHttpClient::Query (CHttpPostStat &amp; objPostStat) <span class="code-keyword">throw</span> () ;</pre></div>

<p><code>CHttpPostStat</code> represents the progress information of the current POST context. The following code demonstrates the basic usage of the <code>CHttpPostStat</code> object:</p>

<div class="SmallText" id="premain12" style="width: 100%; cursor: pointer;"><img preid="12" src="lyoulhttpclient.aspx_files/minus.gif" id="preimg12" height="9" width="9"><span preid="12" style="margin-bottom: 0pt;" id="precollapse12"> Collapse</span></div><div style="margin-top: 0pt;" id="pre12" class="no-vmads"><pre lang="c++"><span class="code-keyword">using</span> <span class="code-keyword">namespace</span> Ryeol ;

CHttpClient         objHttpReq ;
CHttpResponse *     pobjHttpRes = NULL ;
size_t              cbProceed = <span class="code-digit">1024</span> ;  <span class="code-comment">//</span><span class="code-comment"> 1k
</span>

<span class="code-keyword">try</span> {
    ... ;   <span class="code-comment">//</span><span class="code-comment"> Intialize the CHttpClient object
</span>

    <span class="code-comment">//</span><span class="code-comment"> Starts a new POST request
</span>
    objHttpReq.BeginPost (...) or objHttpReq.BeginUpload (...) ;

    <span class="code-comment">//</span><span class="code-comment"> Displays progress information
</span>
    CHttpPostStat       objPostStat ;
    <span class="code-keyword">do</span> {
        <span class="code-comment">//</span><span class="code-comment"> Retrieves progress information
</span>
        objHttpReq.Query (objPostStat) ;

        _tprintf (_T (<span class="code-string">"</span><span class="code-string">\nPost in progress... %2u/%2u\n"</span>)
            , objPostStat.PostedCount ()   <span class="code-comment">//</span><span class="code-comment"> The number of posted parameters
</span>
            , objPostStat.TotalCount ()) ; <span class="code-comment">//</span><span class="code-comment"> The total number of parameters
</span>

        _tprintf (_T (<span class="code-string">"</span><span class="code-string">%s: %10u/%10u %10u/%10u %10u/%10u\n"</span>)
            <span class="code-comment">//</span><span class="code-comment"> The name of the current parameter
</span>
            , objPostStat.CurrParam ()
            <span class="code-comment">//</span><span class="code-comment"> The number of posted bytes of the current parameter
</span>
            , objPostStat.CurrParamPostedByte ()
            <span cl

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -